sizeof(p) 和 sizeof(*p) 不同,而 p 具有矩阵的基本类型

different between sizeof(p) and sizeof(*p) while p has base type of a matrice

我正在学习指针,由于以下程序给出的输出,我有点困惑:

#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; 
}

输出:4800

为什么输出是800?我们知道 p 是一个指针,其基本类型为 10 行和 20 列的二维数组,这意味着 *p 指向 0th array ,这意味着 sizeof(*p)=20*sizeof(int)=80sizeof(p) 应该等同于 800 但输出与我的计算有很大不同!

我能得到一个解释吗?非常感谢。

TL;DR - 始终遵循数据类型!

  • p是指针类型的变量,所以sizeof(p)是你平台上指针的大小,刚好是4.

  • sizeof(*p)sizeof(int[R][C])是一样的,就是一个int的大小乘以RC.结果是 sizeof(int) == 4(在您的平台上),1020,相乘,800

注意:在 sizeof 运算符的情况下,数组不会 衰减 指向第一个元素的指针,它保留类型。

就是说,sizeof 产生类型 size_t 的结果,使用 %zu 格式说明符打印结果。