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

这段代码:

#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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值