首页 > 解决方案 > sizeof(p) 和 sizeof(*p) 之间不同,而 p 具有矩阵的基本类型

问题描述

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

#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的二维数组,这意味着指向矩阵的 ,这意味着并且应该等价于但输出与我的计算方式不同!1020*p0th arraysizeof(*p)=20*sizeof(int)=80sizeof(p)800

我能得到解释吗?非常感激。

标签: cpointersmultidimensional-arraysizeof

解决方案


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

  • p是指针类型变量,sizeof(p)平台上指针的大小也是如此,恰好是4.

  • sizeof(*p), 与 相同sizeof(int[R][C]),是 的大小int,乘以RC。结果是sizeof(int) == 4(在您的平台上),10并且20相乘,800.

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

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


推荐阅读