【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编辑

相关文章
|
15天前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
30 3
|
26天前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
45 0
|
14天前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
27 2
|
22天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
28 1
|
28天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
37 6
|
25天前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
15 2
|
26天前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
26天前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
1月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
1月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。