CSDN上有这么一个问题:
假如有一个二维数组
a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
假如有一个二维数组
a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
//问题1 这里可以理解成有3个元素的数组 每个元素又是有4个int类型元素数组组成的吧?
//那么a[0]是不是应该 是一个有4个元素数组的首地址? 这么理解对不对
还有 一个指针数组
int (*q)[4];//问题2 q是一个指向有4个int型元素数组的指针吧 对不对??
如果上面的问题对
那么 q=a[0]
为什么是不合法的?
还有 一个指针数组
int (*q)[4];//问题2 q是一个指向有4个int型元素数组的指针吧 对不对??
如果上面的问题对
那么 q=a[0]
为什么是不合法的?
http://topic.csdn.net/t/20061020/10/5096078.html
对这个问题,高手们解释了很多。我也在这里总结一下我的看法:
首先,很关键是要搞清楚指针数组跟数组指针的概念:
int* p[5] 这个叫做指针数组,就是有一个数组有5个元素,每个元素是一个指针,每个指针指向一个整数
int (*p)[5] 这个叫数组指针,就是有一个指针,他指向一个大小为5的整型数组。
还有一种是这样的,int **, 这个叫二维指针,就是有一个指针,指向另一个指针,而这个指针指向一个整数。
我经常遇到一个问题,这样的:
int a[3][2] ={0,1,1,2,3,4 } ,这样来定义一个整型二维数组,然后我想把a赋给某个二维指针,结果老是报错:
cannot convert from 'int [3][2]' to 'int ** '
现在可以说知道为什么了。我一直以为二维数组名其实是一个二维指针,其实不然,他应该是一个数组指针,也就是说a应该等价于int (*p)[2] , 他是一个指针,指向长度为2的整型数组。
于是,我要将一个二维数组a赋给一个指针:
int (*p)[2] = a
很好,编译通过了。
指针果然是有许多需要注意的地方啊。