关于数组指针与多维数组的小问题: int (*p)[1];int (*p)[5];int temp[5][5]; 麻烦大虾一定进来看看!

问题详细描述如下:
首先定义一个二维数组:int temp[5][5];那么对该数组的元素的访问有两种方式:下标法:temp[2][3];和指针法:*(*(temp+2)+3)。那么就有如下几个问题了:
问题1:temp它不仅仅是一个指针,而且是一个数组指针,它指向一个由五个int类型的数组。所以对32位系统而言,temp+1在内存中,指针就移动了1*4*5=20个字节。
问题2:temp它不仅仅是一个指针,而且是一个二维指针,那不然怎么会有*(*(temp+2)+3)的操作呢?
由以上两个问题,从而引出了如下问题:
定义一个指针变量:int *p;其实它等价与:int (*p)[1];都是指向一个int类型的数据!
定义一个数组指针:int (*p)[5],那么指针变量p与temp数组名的类型才是完全匹配的。

不知道我上面的分析是否正确,请C编程高手进来帮我解析一下。

问题1:temp可以理解为指向数组的指针,这个数组中存放的是int型的指针,其实所谓的指针都可以理解为地址,例如int a = 0 ;int *p=&a;那么p就是一个整形指针,p的实际值就是a在内存中的位置。

假如 int temp[3][3]={{0,1,2}{3,4,5}{6,7,8}},那么整个数组在内存中的大概样子如下图所示:

问题2:temp不是二维指针,*(temp+2)取出了p3的值,*(*(temp+2)+3)相当于*(p3+3),也就是数组p3的第四个元素值。

引出问题1:不等价,int *p,那么p是指向int型的指针,int(*p)[1],那么p是指向整形数组的指针,类似于temp。

引出问题2:你说得对,不过temp是const int ** 类型,int (*p)[n]都可以和int (*p)[5]同样类型,只是非const。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-12
定义一个指针变量:int *p;其实它等价与:int (*p)[1];都是指向一个int类型的数据!
不, 这两个定义不等效, 指针类型不一样, 第一个p指向int, 第二个p指向地址

定义一个数组指针:int (*p)[5],那么指针变量p与temp数组名的类型才是完全匹配的。
只能说访问元素时语法一样, 本质实现上是有很大差异的: 第一个数组可以放5个指针, 第二个数组可以放25个整数. 第一个定义的内存开销是5*4字节, 第二个定义是5*5*4字节.
相似回答
大家正在搜