全部博文(197)
分类: C/C++
2013-11-01 13:55:51
原文地址:对指针,数组还容易混的地方 作者:好喜儿
记住一点,数组名是数组元素的首地址,或说是数组的第一个元素的首地址,而数组的首地址是&数组名。
举例来说,
int a[5] = {0};
int *p ;
p是指向整形变量的指针,p=a;意思就是将数组元素第一个元素首地址送到p中。&a呢?这个是指向整形数组的指针。那么我们就要定义一个指向整形数组的指针。
int(*p1)[5] = &a;(到目前为止见的不多,写在这,加以深刻的理解)
而5代表这个数组每个元素都有5个整形变量,似乎这上升到二维数组了。是这样的,现在编译器常把&a认为是比a高一级的数组,但是地址和a一样~~~
那么二维数组呢
定义了 int b[5][5];
我们首先要明白二维数组在内存的布局(不懂可以查阅一下)
二维数组实际上不存在的,是有数组的数组,即数组嵌套一个数组来表示的。
那么结合之前我们对一维数组的理解,b[0]就表示被嵌套的一维数组元素的首地址,所以可以定义
int * p1 = b[0];
来指向它~~~而b[0]+1就表示b[0][1]的地址。*(b[0] + 1);也可以写成
*(*b+1);
接着2维数组的问题,还是和上面一维数组相关的~~~
int(*pt)[5];
那么 pt = b ;这里的b是二维数组名,与上面我们讨论的&a是一类的,也就是说与&b[0]是一类的~~~也就是说b + 3 与&b[0] +3 是一回事~~
事实上,pt指向的也是数组首元素的地址,因为这个数组元素的类型时有5个元素
每个元素都是数组类型,所以将其定义为int (*pt)[5];
要记住传参时或用数组指向时是这样一个关系
数组参数 等效的指针参数
数组 : 原型声明char a[10] (传的是a) 指针 : char * p;
数组的数组: char a[3][4] (传的是a) 数组的指针:char (*p)[4]
指针数组: char *a[5] (传的是a) 指针的指针:char **p