从一道习题来学习数组指针

来源:互联网 发布:linux nslookup 命令 编辑:程序博客网 时间:2024/06/05 15:26

这段代码:

#include <stdio.h>

int main()

{

    int a[] = {1,2,3,4,5};

    int* ptr = (int*)(&a+1);

    printf("%d,%d",*(a+1), *(ptr-1));

    return 0;

}

第一个结果很简单,对a+1的地址取内容就是数组的第2个元素,即2。

ptr这个指针到底指向哪里呢?这取决于&a是个什么类型的地址,我们先说答案,这个类型是数组指针,数组指针的步长是整个数组,即sizeof(a),在这里等于20。那么,&a+1就移动到了数组的最后一个元素的下一个字节处。我们把这个地址转换成int*指针,用ptr指代,int*指针的步长是sizeof(int),这里等于4。现在,ptr-1,就移动到了数组的最后一个int元素开始的位置。取内容,自然就是5。所以第2的答案是5。


我们先总体概括下,指针就是一个地址,所以sizeof(指针)大家就是地址长度,一般就是4。同时指针还有一个概念容易被我们忽视 ,就是步长。指针的步长是由指针本身指向的类型长度决定的。

比如int型指针,由于指向的是int,sizeof(int)一般是4,那么步长就是4。

再说数组型指针,由于指向的是数组,所以步长就是sizeof(数组),如上面那个就是20。

ok,那么为什么&a是一个数组指针呢?从定义来看吧。a是个数组名,数组名就是数组首元素的地址,那么也就是个指针了,即a和&a[0]一样的。指向的地址相同,步长也相同。但是&a,是int (*p)[ 5]; p=&a; 虽然p指向的地址的值实际上和a以及&a[0]相同,但是步长不同。于是我们知道了,对数组名取地址,就相当于得到数组的指针。


还有一个概念叫指针数组,比如int* p[5], 它的实质是个数组,只是每个元素是个int型指针,两者没什么太大的关系。


0 0
原创粉丝点击