网易首页 > 网易号 > 正文 申请入驻

C语言指针底层原理

0
分享至

如果要选出C语言中最重要、难度大的概念是什么,那就是指针!难度大,意味着使用方便、实用高效,同时也意味这个知识点复杂、实用的时候容易出错。指针用的好,可以提高代码执行效率、节约系统资源;如果用的不好,程序中就会出现一定的问题。

今天我们就来聊一下指针。从最底层的内存存储空间开始,一直到应用层的各种指针使用技巧,循序渐进,以最简洁的语言进行讲解,希望能对你有一点点帮助就够了。

说明:素材难找,为了偷懒和方便讲解和理解,文中配图的内存空间的地址是随便写的,在实际计算机中是要遵循地址对齐方式的。

变量与指针的本质

内存地址

我们编写一个程序源文件之后,编译得到的二进制可执行文件存放在电脑的硬盘上,此时它是一个静态的文件,一般称之为程序。

当这个程序被启动的时候,操作系统将会做下面几件事情:

·把程序的内容(代码段、数据段)从硬盘复制到内存中;

·创建一个数据结构 PCB(进程控制块),来描述这个程序的各种信息

·在代码段中定位到入口函数的地址,让 CPU从这个地址开始执行。

当程序开始被执行时,就变成一个动态的状态,一般称之为进程。

内存分为:物理内存和虚拟内存。操作系统对物理内存进行管理、包装,我们开发者面对的是操作系统提供的虚拟内存。

这 2个概念不妨碍文章的理解,因此就统一称之为内存。

在我们的程序中,通过一个变量名来定义变量、使用变量。

变量本身是一个确确实实存在的东西,变量名是一个抽象的概念,用来代表这个变量。

那么,我们定义一个变量之后,这个变量放在哪里呢?那就是内存的数据区。

内存是一个很大的存储区域,被操作系统划分为一个一个的小空间,操作系统通过地址来管理内存。

内存中的最小存储单位是字节(8个 bit),一个内存的完整空间就是由这一个一个的字节连续组成的。

32位与 64位系统

我们平时所说的计算机是 32位、64位,指的是计算机的 CPU中寄存器的最大存储长度,如果寄存器中最大存储 32bit的数据,我们就叫作32位系统。

在计算机中,数据一般都是在硬盘、内存和寄存器之间进行来回存取。CPU通过 3种总线把各组成部分联系在一起:地址总线、数据总线和控制总线。地址总线的宽度决定了 CPU的寻址能力,也就是 CPU能达到的最大地址范围。

刚才说了,内存是通过地址来管理的,那么 CPU想从内存中的某个地址空间上存取一个数据,那么 CPU就需要在地址总线上输出这个存储单元的地址。

假如地址总线的宽度是 8位,能表示的最大地址空间就是 256个字节,能找到内存中最大的存储单元是 255这个格子。即使内存条的实际空间是 2G字节,CPU也没法使用后面的内存地址空间。如果地址总线的宽度是 32位,那么能表示的最大地址就是 2的 32次方,也就是 4G字节的空间。

【注意】这里只是描述地址总线的概念,实际的计算机中地址计算方式要复杂的多,比如:虚拟内存中采用分段、分页、偏移量来定位实际的物理内存,在分页中还有大页、小页之分。

变量

我们在 C程序中使用变量来“代替”一个数据,使用函数名来“代替”一个函数,变量名和函数名是程序员使用的助记符。变量和函数最终是要放到内存中才能被 CPU使用的,而内存中所有的信息(代码和数据)都是以二进制的形式来存储的,计算机根据就不会从格式上来区分哪些是代码、哪些是数据。CPU在访问内存实际上是访问地址,而不是访问变量名、函数名。

在程序代码中使用变量名来指代变量,而变量在内存中是根据地址来存放的,这二者之间是通过编译器映射(关联)起来的。

变量有 2个重要属性:变量的类型和变量的值。

示例:代码中定义了一个变量

int a = 20;

类型是 int型,值是 20。这个变量在内存中的存储模型为:

我们在代码中使用变量名a,在程序执行的时候就表示使用 0x11223344地址所对应的那个存储单元中的数据。

因此,可以理解为变量名 a就等价于这个地址 0x11223344。换句话说,如果我们可以提前知道编译器把变量 a安排在地址 0x11223344这个单元格中,我们就可以在程序中直接用这个地址值来操作这个变量。

在上图中,变量 a的值为 20,在内存中占据了 4个格子的空间,也就是 4个字节。为什么是 4个字节呢?在 C标准中并没有规定每种数据类型的变量一定要占用几个字节,这是与具体的机器、编译器有关。

比如:32位的编译器中:

char: 1个字节;

short int: 2个字节;

int: 4个字节;

long: 4个字节。

比如:64位的编译器中:

char: 1个字节;

short int: 2个字节;

int: 4个字节;

long: 8个字节。

为了方便描述,下面都以 32位为例,也就是 int型变量在内存中占据 4个字节。

另外,0x11223344,0x11223345,0x11223346,0x11223347这连续的、从低地址到高地址的 4个字节用来存储变量 a的数值 20。

在图示中,使用十六进制来表示,十进制数值 20转成 16进制就是:0x00000014,所以从开始地址依次存放 0x00、0x00、0x00、0x14这 4个字节(存储顺序涉及到大小端的问题,不影响文本理解)。

根据这个图示,如果在程序中想知道变量 a存储在内存中的什么位置,可以使用取地址操作符&,如下:

printf("&a = 0x%x \n", &a);

这句话将会打印出:&a = 0x11223344。

考虑一下,在 32位系统中:指针变量占用几个字节?

指针变量

指针变量可以分 2个层次来理解:

·指针变量首先是一个变量,所以它拥有变量的所有属性:类型和值。它的类型就是指针,它的值是其他变量的地址。既然是一个变量,那么在内存中就需要为这个变量分配一个存储空间。在这个存储空间中,存放着其他变量的地址。

·指针变量所指向的数据类型,这是在定义指针变量的时候就确定的。例如:int *p;意味着指针指向的是一个 int型的数据。

在 32位系统中,一个指针变量在内存中占据 4个字节的空间。因为 CPU对内存空间寻址时,使用的是 32位地址空间( 4个字节),也就是用 4个字节就能存储一个内存单元的地址。而指针变量中的值存储的就是地址,所以需要 4个字节的空间来存储一个指针变量的值。

示例:

int a = 20;

int *pa;

pa = &a;

printf("value = %d \n", *pa);

在内存中的存储模型如下:

4.在返回到STM32CubeMX后,在Pinout&Configuration里面的pinout view,点击选择PA8 PIN脚,在弹出的小框里面选择RCC_MCO,使得PA8作为MCO输出PIN脚。同样地方式,设置PA1为GPIO Output。

5.本期先分享到这里,想要进群学习单片机编程的同学可以私信我,回复“我要入门”,与我们一起成长,喜欢的可以点个赞关注我们!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
辽宁18岁小伙高考完就跑回老家,晒奶奶做的饭:3年了就馋这一口

辽宁18岁小伙高考完就跑回老家,晒奶奶做的饭:3年了就馋这一口

阿龙美食记
2024-06-15 20:50:59
笑麻了!女子网购裤子裆部现“镂空”设计,商家回应:新潮流!

笑麻了!女子网购裤子裆部现“镂空”设计,商家回应:新潮流!

咖啡店的老板娘
2024-06-14 19:35:03
外媒:以色列面对真主党左右为难

外媒:以色列面对真主党左右为难

参考消息
2024-06-16 09:57:07
心服口服!泰国媒体:中国男足确实比我们强,应该晋级18强赛

心服口服!泰国媒体:中国男足确实比我们强,应该晋级18强赛

国足风云
2024-06-15 16:57:21
安徽将迎大雨、暴雨!

安徽将迎大雨、暴雨!

中安在线
2024-06-16 07:53:07
无证倒卖香烟案引行政诉讼:收回专卖许可是否送达本人?烟草局承认3年后补贴通知

无证倒卖香烟案引行政诉讼:收回专卖许可是否送达本人?烟草局承认3年后补贴通知

红星新闻
2024-06-13 22:58:18
定海神针!中国女排第3局25-21土耳其,张常宁三大作用建奇功

定海神针!中国女排第3局25-21土耳其,张常宁三大作用建奇功

祝晓塬
2024-06-16 11:20:03
一口气连挖大厂几十名骨干,知名品牌被判赔6.4亿元!创始人“失踪”,家人被曝迁居美国,公司已严重资不抵债

一口气连挖大厂几十名骨干,知名品牌被判赔6.4亿元!创始人“失踪”,家人被曝迁居美国,公司已严重资不抵债

每日经济新闻
2024-06-15 18:22:06
阿根廷5名世界杯冠军球员无缘美洲杯:迪巴拉在列

阿根廷5名世界杯冠军球员无缘美洲杯:迪巴拉在列

直播吧
2024-06-15 22:57:42
过“紧日子”的地方政府,已经把手伸进老百姓的口袋里去了

过“紧日子”的地方政府,已经把手伸进老百姓的口袋里去了

浮事记
2024-06-03 11:48:21
现场:凯特王妃首次带三个孩子乘马车露面,夏洛特和路易长大了

现场:凯特王妃首次带三个孩子乘马车露面,夏洛特和路易长大了

王晓爱体彩
2024-06-15 19:15:10
短短14天,皇马超巨走下神坛!欧洲杯沦为背景板,姆巴佩说对了

短短14天,皇马超巨走下神坛!欧洲杯沦为背景板,姆巴佩说对了

我的护球最独特
2024-06-16 03:02:51
记者辟谣三元里成空城,村民表示适应,商户生意也没受太大影响

记者辟谣三元里成空城,村民表示适应,商户生意也没受太大影响

映射生活的身影
2024-06-15 15:36:04
服了啊!姐这是谁红和谁谈啊!

服了啊!姐这是谁红和谁谈啊!

煮娱星球
2024-06-15 11:42:35
凯特和威廉成陌路,两人再也回不去了,三个孩子的表情说明了一切

凯特和威廉成陌路,两人再也回不去了,三个孩子的表情说明了一切

娱乐洞察点点
2024-06-16 08:06:35
重庆楼市全军覆没,重庆房价跌破10000元,重庆楼市6月分析

重庆楼市全军覆没,重庆房价跌破10000元,重庆楼市6月分析

有事问彭叔
2024-06-15 12:19:40
0:0!1:2!中超2大豪门接连爆冷,嘴硬争冠?申花上港背后1大真相

0:0!1:2!中超2大豪门接连爆冷,嘴硬争冠?申花上港背后1大真相

话体坛
2024-06-16 03:59:24
世界女排联赛赛程:16日6场对决,日本对战美国,中国女排对阵波兰

世界女排联赛赛程:16日6场对决,日本对战美国,中国女排对阵波兰

开心体育站
2024-06-16 11:24:46
大灾!45℃的高温,马路热裂,数百万亩地无法耕种,百姓跪地求雨

大灾!45℃的高温,马路热裂,数百万亩地无法耕种,百姓跪地求雨

童童聊娱乐啊
2024-06-15 19:23:44
网传临时搬运工的招聘信息,一天工作15个小时工资80,上厕所时间一天三次违者罚500

网传临时搬运工的招聘信息,一天工作15个小时工资80,上厕所时间一天三次违者罚500

可达鸭面面观
2024-06-14 22:16:19
2024-06-16 12:36:49
小伙单片机编程
小伙单片机编程
想学单片机的看过来,带你入门
75文章数 263关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

法国股市暴跌引发恐慌 马克龙:法国处于非常严峻时刻

头条要闻

法国股市暴跌引发恐慌 马克龙:法国处于非常严峻时刻

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

亲子
时尚
艺术
教育
军事航空

亲子要闻

孩子吃饭时习惯让别人盛饭,外婆是这样做的...

中年女性还是穿连衣裙最有气质!裙摆过膝、腰部收紧,巨显瘦

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

教育要闻

四川卫视#四川卫视腹有诗书#“不积硅步,无以至千里,不积小流,无以成江海”,“成电”青年创新团队努力...

军事要闻

普京提停火和谈条件 美防长迅速回应

无障碍浏览 进入关怀版