您现在的位置是:首页 >学无止境 >C语言之指针初阶(1)网站首页学无止境

C语言之指针初阶(1)

坐落于亚洲之东方 2024-10-10 00:01:02
简介C语言之指针初阶(1)

本章重点

1. 指针是什么

2. 指针和指针类型

3. 野指针

4. 指针运算

5. 指针和数组

6. 二级指针

7. 指针数组

今天我们讲解前4个稍微简单一点的内容,下一篇博客讲解后三部分

首先引入话题

我们口语讲到指针,比如p指针,其实想要表达的意思就是p是一个指针变量

取地址操作符&a取出a的地址,看上图代码

给大家画个图让大家初步认识一下学习指针需要用到的基本理论

32位机器上我们有32根物理电线,32根地址线通电后产生的电信号转化为数字信号,随机产生0  1组成的这样的二进制随机序列,一共有2的32次方个全0到全1的二进制序列

2的32次方个字节,每个地址标识一个字节,那我们就可以给2^32Byte == 2^32/1024KB == 2^32/1024/1024MB==2^32/1024/1024/1024GB == 4GB,在32位机器上最多能寻址(或者管理)4GB的空间,至于64位机器,大家参照32位机器的计算方式可以自己计算一下

在64位机器上,64个比特位就能存放64个01组成二进制数

指针变量是用来存放地址的,地址是唯一标示一个内存单元的

指针的大小在32位平台是4个字节,在64位平台是8个字节

下面指针类型的讲解,大家先别慌,先跟我的思路走,看下图

在X86环境下,打印的指针大小都是4个字节

在X64环境下,打印的指针大小都是8个字节

我们按住F10调试起来看到a在内存中的存储是倒着存放的,为什么呢,大家可以先不管,如果感兴趣,可以去我的数据在内存中的存储那两篇博客中去看一下,不懂的可以在评论区提问

下图是按住F10调试起来给大家有一些疑惑的地方做了一些注释,希望大家能够理解

 

我们将*pa赋值为0,可以看出全部改成了0

 

当我们把指针类型改成了字符指针,大家有没有发现我们只修改了1个字节,这是为什么呢?

这是因为指针类型决定了解引用操作的权限,看下图

下面给大家讲解指针+-整数

指针+-一的细节已经给出大家代码和讲解了,希望大家能够理解

下面是一个很有意思的知识点:野指针

概念:野指针就是指针指向的位置是不可知的  随机的  不正确的  没有明确限制的

野指针第一种情况 

指针未初始化

野指针第二种情况

指针越界访问

当P指向超过数组范围的位置时,P就已经越界访问了,这就是第二钟野指针的情况

第三种情况

局部变量的作用域进入函数创建,出来函数就销毁,但是return  &a把a的地址带回去了,*p又去访问,则就是非法访问

yH5BAAAAAAALAAAAAAOAA4AAAIMhI+py+0Po5y02qsKADs=wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

我们必须对指针进行严格地初始化,养成良好的代码习惯

例如,指针p使用完了之后需将其置为NULL(空)

接下来是第四个部分

指针的第一种和第二种运算已经给大家画出图了,大家自行阅读,理解起来还是比较容易

最后一种运算

对比简化前的代码简化后的代码,大家对比起来看,第二种代码就发生了错误

本章终,希望大家多多支持,下一博客我们讲解后面3个部分的知识,大家先复习一下前面讲过的知识

 

 

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。