现在的位置: 首页 > 综合 > 正文

一个二维数组指针的问题

2013年08月16日 ⁄ 综合 ⁄ 共 914字 ⁄ 字号 评论关闭

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

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

【上篇】
【下篇】

抱歉!评论已关闭.