【C语言】站在数组的角度看指针

   30adcf5df8b44dc8bc660f667cada2c4.jpeg

哈喽大家好,我是保护小周ღ,C语言,接下来给大家带来的是深入理解数组和指针——数组元素的访问,这篇主要讲的是基础指针和数组的相关知识,是博主的所见所闻,细节上的知识后面会这里面没有提,会放在后期的文章讲,多多包含~


一、数组元素的访问

所谓数组,通俗来讲就是在内存的栈区上开辟一块连续的数据类型相同的存储空间,栈区内存的使用习惯:先使用高地址处的空间,再使用低地址处的空间。数组在内存的栈区上开辟了一块连续的存储空间,数组每个元素的地址根据数组的下标的增长,由低地址向高地址变化。


1.1 下标操作符 

数组访问可以通过数组名+  "[ ]"数组下标操作符+ 下标元素来访问。

怎么理解呢,数组名一般情况下代表数组首元素的地址(除了sizeof() 和&数组名 这两个代表取整个数组的地址),数组名我们看作起点,[ ] 整个操作符 我们看作钥匙,下标元素就是房间号,知道了需要访问的地址,再掏出钥匙,是不是就可以访问到了空间里的数据了。

数组名代表首元素的地址,就是内存上的一块地址,有自己的编号,然后数组又是顺序开辟的空间,这是整体的一个逻辑。


那数组名是什么类型的数据呢,这个问题不知道大家有没有思考过,他是一块地址诶,指针的实质也是地址,那是不是就可以理解为 数组名的类型是数组元素类型的指针,例如 int arr[10] ;  那么 arr 数组名的类型就是 int* ,数组的每一个元素为 int 类型,既然数组名是地址,那么我们是否可以定义一个指针指向(存储)数组名的地址,然后通过这个指针来访问数组的每一个元素呢?


1.2 指针遍历

上期我们也讲到过,指针加减整数,指针的类型决定了指针向前或者向后走一步可以跳过几个字节,那我们是不是可以通过指针的这一特性来遍历数组呢?

 怎么理解 *(pa+i )呢, 不急不急,且听我慢慢道来

整型指针+1,以当前存储的地址为基准,向高地址走4个字节,但是不会改变原先存储的地址,+2就是走8个字节咯。-1,以原存储的地址为基准,向低地址走4个字节。 


看到这里大家会不会想,指针可以这样玩,那他可不可以,不指向数组的首地址,指向任意某个数组元素的地址,然后再加减访问元素呢?

当然是没有问题的啦,但是不建议这么玩,等下你都不知到指针指向哪里了,一不小心就会造成越界访问。


还有一种指针遍历数组的方式呢是一次性的,就是指针会改变自身指向(存储)的地址,然后再解引用操作也可以达到遍历的效果,这种方式要根据具体的情况来决定是否使用。 

这里的 后++ 作用在 pa 指针上,先使用,后自增,当前语句pa++ 等于 pa ,此时执行解引用操作即可的到第一个元素的值,但是pa++ 执行完了,导致 pa 指针“跨”了一步,那pa 指针指向的位置就往前跨了4个字节,改变了自己原来存储的地址,就相当于 pa = pa+ 1;   

此时我们再输出就会发现,已经是随机值了,原因是最后一个 pa++ 执行完了后,pa 存储的地址已经是越界访问了,数组并没有那么长,所以造成了随机值。

还有一点要重点注意,(*pa)++ 不等于 *pa++ , 这两个的优先级不一样, (*pa)有括号,优先执行解引用操作,进入到了该空间里面,此时再执行++ 就是作用在 该空间里面的数值上,而不是作用在指针上面,这一点大家要注意。

错误示范:


至此C语言关于数组和指针相结合的遍历访问博主已经分享完了,相信大家对指针有了不一样的理解,尽请期待数组 &&指针。

40e36dfc27804c04afb4a9da45afda94.jpeg

本期收录于博主的专栏——C语言,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“C语言基础知识”。C语言_保护小周ღ的博客-CSDN博客

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ  *★,°*:.☆( ̄▽ ̄)/$:*.°★*  

文章多处存在借鉴,如有侵权请联系修改删除!dd8b4788b2554df4bec4b8202395cad2.gif

  • 165
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 211
    评论
评论 211
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

保护小周ღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值