在下面的代码中,如果我更改 int (*p)[R][C];
至int p[R][C];
结果从 800 更改为 80。为什么会发生这种情况,正如我在 int p[R][C];
中所理解的那样数组名称 p
也是一个类似 *p
的指针在int (*p)[R][C];
#include <stdio.h>
#define R 10
#define C 20
int main()
{
int (*p)[R][C];
printf("%d", sizeof(*p));
getchar();
return 0;
}
PS:-是*p
在int (*p)[R][C];
充当指向另一个实际上指向数组的指针的指针?
最佳答案
这个
int (*p)[R][C];
声明一个指向类型为int[R][C]的数组的指针。表达式 sizeof( int[R][C] )
的结果等于 R * C * sizeof( int )
。
表达式*p
的类型为int[R][C]
。因此 sizeof( *p )
等价于 sizeof( int[R][C]
)。
至于这个声明
int p[R][C];
然后表达式 *p
中的数组指示符 p 被转换为指向其第一个元素的指针,并取消引用该指针,您将获得类型为 int[ 的数组的第一个元素C]
.
因此,对于变量 p
作为指针的第一次声明 sizeof( *o )
等于 sizeof( int[R][C]
.
对于作为二维数组的变量 p
的第二次声明,sizeof( *p )
等于 sizeof( int[C] )
.
使用 p 的第一个声明作为指针,如果您编写,您可以获得与声明为数组的 p 相同的结果
sizeof( **p )
这是在第一次获取第二个声明中使用的类型的对象时取消引用指针,以将变量 p 声明为数组。
注意这个调用
printf("%d", sizeof(*p));
由于使用了错误的转换格式而具有未定义的行为。你必须写
printf("%zu", sizeof(*p));
关于c - 为什么更改指向数组名称的指针会改变结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60117759/