《C语言深度剖析》第四章 指针和数组 p1 C语言从入门到入土(进阶篇)(一)

简介: 本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始!

指针和数组


1. 指针


指针是什么

在回答这个问题之前,我想先问:


1.1 如何看待下面代码中的a变量?


37.png

反汇编可以看一下:

38.png

重新理解变量:

定义一个变量,本质是在内存中根据类型来进行开辟空间。有了空间,就必须具有地址来标识空间,来方便CPU进行寻 址。有了空间,就可以把数据保存起来。所以,目前我们先讨论变量的空间和内容这两个概念



1.2. 什么是指针?

指针就是地址!那么地址本质是什么呢?地址是数据,那么数据可不可以被保存在变量空间里面呢?当然可以。


1.3. 有没有指针变量这个概念?

保存指针(地址)数据的变量就叫做指针变量


2.1. 指针 和 指针变量又有何不同?我们口语中的"定义一个指针"究竟是什么意思?我们该如何理解这种说法?


严格意义上,指针和指针变量是不同的,指针就是地址值,而指针变量是 C 中的变量,要在特定区域开辟空间,要用来保存地址数据,还可以被取地址。( 先分开 )

但是,我们经常在口语化表达的时候,又经常将这两个概念混合,具体原因无从考证,不过个人认为与最早的 C 资料 ( 书,文档之类) 的翻译有关。然后,书与书之间互相借鉴,形成了这样的说法。同时,简化说法,也更符合人的表达习惯,估计老外也是这么想的。( 在关联 )

那么我们以后怎么认为呢?我们分开理解,但是依旧关联使用。自己使用的时候,混合使用可以。和别人讨论,最好明确概念。


2.2.1. 代码理解

39.png所以说我们平时使用的指针,严格上讲是指针变量(因为有左值右值)。

个人认为最好区分指针和指针变量的方法就是:

有没有用他的空间,或是说他有没有开辟空间,有就是指针变量。


2.2.2. 代码理解*p进行解引用的时候,p对应的左值还是右值?

int a=10;
int *p=&a;
*p=10;
int b=*p;

左边是*p取的是a的空间(左值),是把10放了进去。

右边的*p取的是a的值(右值),是把a放进了b的空间。

对指针解引用,代表的是指针所指向的目标。

结论:指针就是地址,指针变量是一个变量,变量内部保存指针(地址)数据。


3. 为什么要有指针


3.1. 回答一个问题:为何每间宿舍都要有门牌号呢?

如果要一个外人来宿舍找你,是不是有门牌号更好找?

结论:提高查找效率。


类比到计算机中

CPU在内存中寻址的基本单位是多大?

在32位机器下,最多能够识别多大的物理内存?

既然CPU寻址按照字节寻址,但是内存又很大,所以,内存可以看做众多字节的集合


40.png

其中,每个内存字节空间,相当于一个学生宿舍,字节空间里面能放8个比特位,就好比同学们住的八人间,每个人是一个比特位。

每间宿舍都有门牌号就等价于每个字节空间对应的地址,即该空间对应的指针。

那么,为何要存在指针呢?

为了CPU寻址的效率。如果没有,该怎么找在字节空间中的数据呢?


3.2. 那又有一个问题:CPU如何拿取数据?

CPU首先要先知道拿取数据的地址,这个地址是内存通过地址总线传输给CPU的,然后CPU拿着这个地址又通过数据总线去内存读取数据。


4. 究竟该如何理解编址


首先,必须理解,计算机内是有很多的硬件单元,而硬件单元是要互相协同工作的。所谓的协同,至少相互之间要能够进行数据传递。

但是硬件与硬件之间是互相独立的,那么如何通信呢?答案很简单,用"线"连起来。

而CPU和内存之间也是有大量的数据交互的,所以,两者必须也用线连起来。

不过,我们今天关心一组线,叫做地址总线。

CPU访问内存中的某个字节空间,必须知道这个字节空间在内存的什么位置,而因为内存中字节很多,所以需要给内存进行编址(就如同宿舍很多,需要给宿舍编号一样)

计算机中的编址,并不是把每个字节的地址记录下来,而是通过硬件设计完成的。

钢琴 吉他 上面没有写上“都瑞咪发嗦啦”这样的信息,但演奏者照样能够准确找到每一个琴弦的每一个位置,这是为何?因为制造商已经在乐器硬件层面上设计好了,并且所有的演奏者都知道。本质是一种约定出来的共识!

硬件编址也是如此

我们可以简单理解,32位机器有32根地址总线,每根线只有两态,表示0,1【电脉冲有无】,那么一根线,就能表示2中含义,2根线就能表示4中含义,依次类推。32根地址线,就能表示2^32中含义,每一种含义都代表一个地址。

地址信息被下达给内存,在内存内部,就可以找到改地址对应的数据,将数据在通过数据总线传入CPU内寄存器。


41.png


    地址总线上发出的地址信息


5.1. 指针的内存布局

int a = 10; 
int *p = &a;

1. 这里定义了几个变量?在哪里定义的?

2. 一个整形,有4个字节,那么应该有4个地址!那么&a取了哪一个地址?那么如何全部访问这4个字节呢?

3. 如何正确的画出指针指向图?

1.两个,一个整型变量a,一个指针变量p。

2.取的最低的地址,访问就是从最低的地址连续访问4个字节。(int)

3.如下图: 36.png

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