问题详细描述如下:
首先定义一个二维数组: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。