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

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

  image.gif编辑

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


一、数组元素的访问

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

image.gif编辑


1.1 下标操作符

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

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

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

image.gif编辑


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

image.gif编辑


1.2 指针遍历

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

image.gif编辑

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

image.gif编辑

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


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

image.gif编辑

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


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

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

image.gif编辑

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

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

错误示范:

image.gif编辑


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

image.gif编辑

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

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

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

相关文章
|
23天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
76 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
23天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
47 9
|
23天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
41 7
|
23天前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
72 6
|
26天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
52 5
|
26天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
26天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
93 3
|
27天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
26天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
36 1
|
1月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。