指针和数组的关系
很多人都分不清指针和数组之间的关系,严格的来讲指针和数组之间没关系,指针是指针,数组是数组。只不过他们两个都可以通过“*”引用的方式和下标的方式来访问元素而已。
例:
int a[5]={1,2,3,4,5};
int *p=a;
a[5]占20个字节的大小,而p只占4个字节的大小,其次p本身有自己的地址,只不过他里面存放的是数组首元素的地址。
要访问3则有两种方式:a[2]或者*(a+2).
其中(a+2)就是的形式访问的,因为a表示首元素的地址,加2表示向后偏移2个整形大小,找到3的地址,在通过*得到3.
在编译器中a[2]会被先解析成*(a+2)访问的。
数组指针和指针数组:
注意:[]的优先级高于*,指针数组是一个数组,只不过里面的元素全部都是指针。数组指针是一个指针,指向数组的指针,偏移的单位是整个数组。
例:
int a[6]={1,2,3,4,5,6};
int (*p2)[6];
p2=a;
这是错误的,因为指针p2的类型是int [6],所以应该是p2=&a;
int (*p2)[3];
这样的话p2的类型是int [3],所以p2=(int(*) [3])&a; 要强制转换成数组指针的类型。
注意:数组指针“所指向”的类型就是去掉指针变量的名字之后所剩下的内容。
数组指针的类型就是去掉指针后剩下的内容。
例:int (*p3)[5];
p3的类型是 int [5];
p3所指向的类型是 int (*)[5];