int *(*a)[3][4]

本文深入解析了一个复杂的指针定义:int *(*a)[3][4]。通过逐步分解,解释了不同类型的指针及其所占内存大小,并给出了具体的示例程序帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int   *(*a)[3][4]  
   
  求    
  sizeof(a)  
  sizeof(*a)  
  sizeof(**a)  
  sizeof(***a)  
  sizeof(****a)  
  结果我知道,有没有人能解释下具体原因。

 

其中,  
  a         是一个指向2维指针数组的指针。  
  *a       是2维指针数组。  
  **a     是一维指针数组。  
  ***a   是数组中的元素,也就是一个指向整数的指针。  
  ****a   是一个整数。  
   
  这样,每一个的大小就清楚了。对于32位平台,4,48,16,4,4

 

注意这个指针占4个字节,int也占4个字节。  
  要是把定义改成   char   *(*a)[3][4],对应大小就变成   4,48,16,4,1了。指针占的大小没变,char只占1个字节。  

这个问题涉及到“结合性”。[]运算符的结合性大于*,另外,变量定义要从右往左读,所以  
  int**   a[3][4]应该解释为:有一个3*4的数组,它的名字叫a,每个元素的类型是int**。  
  不信你可以试试这个程序:  
  #include   <iostream>  
  #include   <typeinfo>  
   
  using   namespace   std;  
   
  int   main()  
  {  
  int**   a[3][4];  
  int**   p;  
  if(typeid(a[0][0])==typeid(p))  
  cout<<"a[0][0]   is   an   int**"<<endl;  
  }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值