C中函数指针数组的表达
Expression of array of function pointer in C
我是 C 初学者,我了解到指针可以用数组表示,反之亦然。
点赞*p == p[0]
、p[1][2] == *(*(p+1)+2)
这些会导致*p[i](arg1, arg2) == p[0][i](arg1, arg2)
吗?
Does these lead to *p[i](arg1, arg2) == p[0][i](arg1, arg2)?
实际上,*p[i](arg1, arg2)
被解析为 *(p[i](arg1, arg2))
- 它对函数调用的结果应用 *
取消引用运算符。
p[0][i](arg1, arg2)
等于 (*p)[i](arg1, arg2)
.
学习编程需要大量的实验。下面的小程序表明你的假设 *p[2] == p[0][2]
是错误的。
#define f(x) void f ## x(void) {printf("Func = %d\n", x);}
f(10);f(11);f(12);
f(20);f(21);f(22);
f(30);f(31);f(32);
int main()
{
void (*p[3][3])(void) = {{f10, f11, f12}, {f20, f21, f22}, {f30, f31, f32}};
for(int x = 0; x < 3; x++)
{
for(int y = 0; y < 3; y++)
{
printf("%p\t", (void *)p[x][y]);
}
printf("\n");
}
printf("\np[0][2] = %p\n", (void *)p[0][2]);
printf("*p[2] = %p\n", (void *)*p[2]);
}
结果:
0x4005b2 0x4005cd 0x4005e8
0x400603 0x40061e 0x400639
0x400654 0x40066f 0x40068a
p[0][2] = 0x4005e8
*p[2] = 0x400654
这样的实验比 1000 道在线问题更能让你理解这个主题。在学习上付出一些努力。如果你不明白某些东西 - 写这样的东西看看它是如何工作的。
函数指针的行为就像普通的对象指针。表达式中使用的数组将衰减为指针( 不是 反之亦然!),这允许我们使用 []
运算符,这又要求左操作数是一个指针。
这里有解释:
您的特定代码的问题在于 []
等后缀运算符优先于 *
等一元运算符。意思是 (*p)[i](arg1, arg2)
等同于 p[0][i](arg1, arg2)
。后者显然是首选,因为它更具可读性。
我是 C 初学者,我了解到指针可以用数组表示,反之亦然。
点赞*p == p[0]
、p[1][2] == *(*(p+1)+2)
这些会导致*p[i](arg1, arg2) == p[0][i](arg1, arg2)
吗?
Does these lead to *p[i](arg1, arg2) == p[0][i](arg1, arg2)?
实际上,*p[i](arg1, arg2)
被解析为 *(p[i](arg1, arg2))
- 它对函数调用的结果应用 *
取消引用运算符。
p[0][i](arg1, arg2)
等于 (*p)[i](arg1, arg2)
.
学习编程需要大量的实验。下面的小程序表明你的假设 *p[2] == p[0][2]
是错误的。
#define f(x) void f ## x(void) {printf("Func = %d\n", x);}
f(10);f(11);f(12);
f(20);f(21);f(22);
f(30);f(31);f(32);
int main()
{
void (*p[3][3])(void) = {{f10, f11, f12}, {f20, f21, f22}, {f30, f31, f32}};
for(int x = 0; x < 3; x++)
{
for(int y = 0; y < 3; y++)
{
printf("%p\t", (void *)p[x][y]);
}
printf("\n");
}
printf("\np[0][2] = %p\n", (void *)p[0][2]);
printf("*p[2] = %p\n", (void *)*p[2]);
}
结果:
0x4005b2 0x4005cd 0x4005e8
0x400603 0x40061e 0x400639
0x400654 0x40066f 0x40068a
p[0][2] = 0x4005e8
*p[2] = 0x400654
这样的实验比 1000 道在线问题更能让你理解这个主题。在学习上付出一些努力。如果你不明白某些东西 - 写这样的东西看看它是如何工作的。
函数指针的行为就像普通的对象指针。表达式中使用的数组将衰减为指针( 不是 反之亦然!),这允许我们使用 []
运算符,这又要求左操作数是一个指针。
这里有解释:
您的特定代码的问题在于 []
等后缀运算符优先于 *
等一元运算符。意思是 (*p)[i](arg1, arg2)
等同于 p[0][i](arg1, arg2)
。后者显然是首选,因为它更具可读性。