问题描述
#include <stdio.h>
#define R 10
#define C 20
int main()
{
int arr[R][C];
int (*p)[R][C]=&arr;
printf("%d ",sizeof(p));
printf("%d ",sizeof(*p));
return 0;
}
输出:4
800
为什么输出是800
?我们知道 p
是一个指针,它具有 10
行和 20
列的二维数组的基本类型,这意味着 *p
指向 {{1 }} ,这意味着 0th array
和 sizeof(*p)=20*sizeof(int)=80
应该等价于 sizeof(p)
但输出与我的计算有很大不同!
我能得到解释吗?非常感谢。
解决方法
TL; DR 强> - 始终跟随数据类型
!-
p
是指针类型变量,因此sizeof(p)
是您平台上指针的大小,恰好是4
。 -
sizeof(*p)
,是相同的sizeof(int[R][C])
,这是的大小的int
,乘以R
和C
。其结果是sizeof(int) == 4
(平台),10
和20
,相乘,800
。
注意:在sizeof
运营商的情况下,该阵列不衰变的指针的第一个元素,它保留了类型
这就是说,sizeof
产生类型的结果size_t
,使用%zu
格式说明打印结果。