一个二维数组指针的问题

挺不错的一个问题,自己整理了一下,详细可查:

http://topic.csdn.net/u/20091214/10/da5c0155-6055-4ef5-8cb6-cad8fc72136c.html?seed=1804958680&r=61913848#r_61913848

 

问题:

#include"stdio.h"
void main()
{
int y[4][3]={{1,1,1},{1,1,1},{1,1,1},{1,1,1}};
printf("%d %d %d %d/n",*(y+2)+2-*y,&y[2][2]-y[0],sizeof(*(y+2)+2),sizeof(*y));
int z[4][3];
printf("%d %d",*(z+2)+2-*z,&z[2][2]-z[0]);
}

用的是VC编译器,整型占4个字节,输出结果不知道怎么理解,(8 8 4 12
8 8Press any key to continue)前面两个8是等效的,而就情况来看,整型占4个字节,应该是32而不是8啊,为什么会是8,下面的结果是4和12,又不知道怎么理解, 他们表示的都是地址的长度,VC中地址是4个字节的啊,应该相等,为什么结果有不同呢?

 

 

 

解答:

y的类型是 int [4][3]
在y参与的表达式中,y的值被转换为int (*)[3]型。
y[i] i=0,1,2,3 的类型是 int [3],
在y[i]参与的表达式中,y[i]的值被转换为 int * 型。

表达式*(y+2)+2-*y 中,相当于y[2]+2-y[0]
y[2]和y[0]的类型转换成 int *, 它们两者之间有6个int,所以,y[2]-y[0]=6, 再加上2, 就是8。


&y[2][2]-y[0] 
y[2][2]类型是int, &y[2][2]类型是int *,  和y[0]相差8个int,所以是8

sizeof(*(y+2)+2) 相当于sizeof( y[2]+2 ) y[2]的类型在式中转换成int *, 所以 y[2]+2 的类型是int *, 是4


sizeof(*y) *y中的y, 转换成int (*)[3],所以*y是int [3], 所以,sizeof(*y)是12
或者这么理解,*y即y[0],类型是int [3], 所以结果为12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值