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));