C中的数组指针

4月 3rd, 2013 1,812 留下评论 阅读评论

最近又粗粗看了遍C++ primer,又看到一些已然忘了或者以前都不知道的C特性,指针什么的真是太难以完全掌握了>_<。今天想了一个早上,终于算是明白了,赶紧写一篇博客给以后再忘记了的自己看…

铺垫

int A[10]; //一维int数组

A表示整个数组,sizeof(A) = sizeof(int) * 10;

A也表示数组首地址,可以隐式地转化为第一个数组元素(一个int*)的指针,即*A == A[0];

一维数组

int A[10]; //用一维数组说明比较好明白,但是不常用

int (*p)[10] = &A; //p就是数组指针,一个专指向 含有10个int的数组 的指针,所以对A取地址赋给p就对了

p[0] == *p == A; //p[0]相当于对p进行一次解引用的*(p + 0),表示的都是原地址所在的那个数组A

p[0][1] == *(*p + 1) = A[1] //在上面一条的基础上,再看这个就好理解了,就是对数组的基本操作而已。因为数组和指针的隐式转化,可以进行一次解引用操作,变为数组元素,所以允许 **p的存在(第一次解引用,从数组指针->数组;第二次解引用,是数组名作为数组首地址隐式转化为指针然后解引用为数组元素),不能因2次解引用就说p是指针的指针(就在这儿想了好久)。

二维数组

int B[10][10]; //再用二维数组说明,这个作为书上的例子,比较常用

int (*p)[10] = B; //二维数组名直接赋值,因为二维数组名相当于对一维数组取地址(类比:一维数组名相当于对其元素取地址;一维数组就是二维数组的元素!)

int (*p)[10] = &B[0]; //与上面的赋值同样,这就是一维数组的赋值方法

p[0] == *p == B[0]; //都表示第一个一维数组,对它们进行sizeof()操作,结果都是40

p[2][3] == *(*(p + 2) + 3) == B[2][3] //对p数值计算,比如p++,步长为sizeof(int) * 10,跳过整个一维数组

Categories: C&C++ 标签:,
  1. 还没有评论呢。