数组不是指针,数组名的值是一个指针常量。
依据《c和指针》《c专家编程》上的例子,来总结一下。
int array[10];
int *ap =array + 2;
然后会有以下例子:
在c/c++中,array[2],2[array]是一样的,源自于同样的 *(array +2)的指针形式写法
多维数组(从二维数组说起)
*(*(p+i)+j)//是p[i][j]
二维数组函数传参比较麻烦,下图参考《c专家编程》
int data[3][4] = {{1,2,3,4}, {9,8,7,6}, {2,4,6,8}};
以上的数组也可以写成一维的形式:
int data[3][4] = {1,2,3,4,9,8,7,6,2,4,6,8};
或:
int data[][4] = {1,2,3,4, 9,8,7,6, 2,4,6,8};
二维数组在内存中的存储其实质是一维的。二维数组为一个数组的数组(见上一个图),也就是元素是数组的数组。二维数组完全可以理解为一个行列式,如上面的二维数组就是一个三行四列的数组。三行就是三个一维数组(或三个指针,每个指针表示一个一维数组)data[0]、data[1]、data[2].
/////////这是作为个人去理解////////////////
data[3][4]作函数参数时可以用下面的形式进行调用:
int sum(data,3);
为什么第二个参数是3而不是4呢?data数组的元素是3个(相当于是一个一维的3个元素的数组,其元素的类型又是一个一维数组)。data这种类型可以理解为:pointer-to-array-of four-int。
二维数组作函数参数时可以用下面的原型定义:
int sum(int (*ar2)[4], int size);
表示处理一个size行4列的函数。
int (*ar2)[4]是一个数组指针。ar2是一个指针,指向一个整型的一维数组,这个一维数组的长度是4。
理解指针数组与数组指针,先要理解一个运算符优先级的问题,“[]”的优先级比“*”要高。int *ar2[4],p1 先与“[]”结合,所以先是一个数组,因为又有*的声明,所以是一个指针数组。int (*ar2)[4],()优先级高,所以表明这个声明是一个指针,然后有数组[]的修饰,表明是一个数组指针。