C指针详解

C指针详解我们由上面可知指针变量是用来存放一个数据的地址的 同时它本身也是占内存的 意思是在内存中取一块空间专门用来存放地址的 那它占多少内存呢 所以 根据数组名是数组 元素的地址这个规则 维数组的数组

大家好,欢迎来到IT知识分享网。

一.细说指针

1.1内存与地址

在生活中有个案例,在大学宿舍如果找人如果整个宿舍楼去找会很麻烦,如果我们将整个宿舍楼分为一个个单元(及一个个寝室),如果知道要找的人的寝室号会让 我们更便捷。有了房间号,如果你的朋友得到寝室号,就可以快速的找房间,找到你。

C指针详解

把这个放在计算机中理解性质一样,我们知道计算机cpu处理数据时需要从内存中提取数据,处理后的数据也要放在内存中,那么内存中如何有效的管理数据呢?计算机中将内存分为一个个内存单元,每一个内存单元取一个字节。

C指针详解

注意⼀个⽐特位可以存储⼀个2进制的位1或者0

其实,一个内存单元就和一个寝室相同,一个内存单元可以存放8个比特位,每个内存单元都有自己的“门牌号”,在计算机中我们把内存单元的“门牌号”称为地址,在C语言中称为指针,所以就是     地址==指针==内存单元的“门牌号”

二.指针变量及其大小

2.1取地址操作符(&)

经过了解内存与地址关系,我们回到C语言中,任何在程序中定义的变量、函数、数组、结构体和类都会被分配一个具体的内存地址,以便程序可以在运行时正确地访问和操作这些对象。那我们如何拿到这些东西的地址呢?这⾥就得学习⼀个操作符(&)-取地址操作符。

C指针详解

&a取出的是a所占4个字节中地址较⼩的字节的地址。虽然整型变量占⽤4个字节,我们只要知道了第⼀个字节地址,顺藤摸⽠访问到4个字节的数据也是可以的。

2.2指针变量和解引⽤操作符(*)

2.2.1指针变量

在我们创建一个变量、函数、数组、结构体和类的时候,会创建一个空间存放他们,这时他们所存放空间的地址又存放在哪里呢?答案是指针变量。

C指针详解

2.2.2指针类型的分类

指针类型可以根据指针指向的数据类型进行分类

1. 指向整型的指针:指针变量指向整型数据的地址。例如:int* p;

2. 指向字符型的指针:指针变量指向字符型数据的地址。例如:char* p;

3. 指向浮点型的指针:指针变量指向浮点型数据的地址。例如:float* p;

4. 指向数组的指针:指针变量指向数组的首地址。例如:int* p[];

5. 指向结构体的指针:指针变量指向结构体的地址。例如:struct Student* p;

6. 指向函数的指针:指针变量指向函数的地址。例如:int (*p)(int, int);

7. 空指针:指针变量没有指向任何有效的地址,也就是NULL指针。

这些是指针类型的常见分类,根据需要可以定义更多类型的指针。

2.2.3如何理解指针类型

如:int *p=&a,表示p是指针变量,int 则表明指针变量所指向的是整形类型的对象,其他的也如同这个一样。

2.2.4解引⽤操作符

在宿舍里里加上宿舍号的目的是为了方便找到人,那我们创建指针变量目的是为了拿到我们所要数据的地址,这⾥必须学习⼀个操作符叫解引⽤操作符(*)。

C指针详解

2.3指针变量的大小

我们由上面可知指针变量是用来存放一个数据的地址的,同时它本身也是占内存的(意思是在内存中取一块空间专门用来存放地址的),那它占多少内存呢?地址的大小取决于所使用的寻址方式和系统架构。在大多数计算机系统中,一个地址通常由一个特定数量的字节组成。在32位系统中,地址通常由4个字节组成,而在64位系统中,地址通常由8个字节组成。因此,地址大小可以是4字节(32位)或8字节(64位)

三.指针变量类型的意义

既然指针变量的⼤⼩和类型是⽆关的,那么指针变量类型有什么用呢?

3.1 指针的解引⽤

对比一下两段代码

C指针详解

3.2 指针+-整数
C指针详解

3.3 void*指针

四. const修饰指针

4.1const修饰变量

当我们在编写一段代码时不想让变量的值被修改时该怎么办?这时const的作用就体现了。

C指针详解C指针详解
 

n本来是变量可以修改,但在const的限制下不可修该,但是如果我们绕过n取使用n的地址却可以修改n

C指针详解
为什么变量n被const修饰后还能被修改呢?这时就要介绍const修饰指针变量。

4.2const修饰指针变量

const修饰指针变量分为两类:

4.2.1const放在 左边

C指针详解

C指针详解

C指针详解
4.2.2const放在 * 右边

C指针详解

4.2.3const同时在 * 两边时

当const在*两边时这个变量彻底不可以被修改。

五.野指针成因与避免

5.1 野指针成因

5.1.1指针未初始化

C指针详解

5.1.2指针访问越界

C指针详解

5.1.3指针指向的空间释放

C指针详解

5.2如何避免野指针

5.2.1指针初始化

5.2.2⼩⼼指针越界

5.2.3指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性

5.2.4避免返回局部变量的地址

六.数组与指针的关系

6.1数组名的理解

在指针中数组名也是一个地址,其代表的是数组首元素的地址,与&arr[0]表达同样的地址

C指针详解
 

注意:数组名有两个特殊的用法

2.   &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)

6.2使⽤指针访问数组

C指针详解

由这里我们可以发现可以通过指针访问数组的,那还有什么指针形式可以访问数组呢?

C指针详解

由上可知这里的arr与p是等价的,这就代表了我们可以通过p[i]来访问数组,所以本质上p[i]是等价于*(p+i)。

6.3数组传参的本质

我们之前学过如何将数组传入函数中,那我们有没有想过其中的本质呢?先看一下下面的代码

C指针详解

这里的实参传的是函数名,由7.1可知数组名代表首元素地址,本质上数组传参传递的是数组⾸元素的地址,注意的是形参可以写成数组形式也可以写成指针形式。

还有一点要注意int sz1 = sizeof(arr) / sizeof(arr[0]);要放在主函数里计算,因为函数形参的部分理论上应该使⽤指针变量来接收⾸元素的地址。那么在函数内部我们写sizeof(arr) 计算的是⼀个地址的⼤⼩(单位字节)⽽不是数组的⼤⼩(单位字节)。正是因为函数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。

七.指针变量详解

7.1字符指针变量

在指针的类型中我们知道有⼀种指针类型为字符指针 char*

有一种情况需要注意:

C指针详解

这里的字符串是将首字符串的地址存放在字符指针变量里。这里还要介绍一个东西,常量字符串

常量字符串是指在程序中使用的字符串值,其值是固定不变的,不会被修改或者重新赋值。常量字符串在程序中可以直接使用,而不需要定义变量。常量字符串可以用单引号或者双引号括起来,上面的正式常量字符串,常量字符串的值是不可修改的,试图修改常量字符串的值会导致编译错误。,正因为不可修改所以在*前加const

7.2数组指针变量

7.2.1数组指针变量是什么?

解释是因为()的优先级所以p 先与  * 结合所以是指针。

7.2.2数组指针变量怎么初始化?

数组指针变量是⽤来存放数组地址的,那怎么获得数组的地址呢?就是我们之前学习的 &数组名 。如果要存放个数组的地址,就得存放在数组指针变量中,如下: int(*p)[10] = &arr;

7.2.3二维数组传参的本质

C指针详解

7.3函数指针变量

7.3.1函数指针变量的创建

函数指针变量是什么呢?由我们对数组指针的解释不难想到函数指针变量是存放函数地址的变量。那么函数是否有地址呢?函数名是否也和数组名的地址有类似之处呢?

C指针详解

C指针详解

C指针详解

7.3.2函数指针变量的使用

C指针详解
 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120662.html

(0)
上一篇 2025-10-28 11:20
下一篇 2025-10-28 11:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信