1-4 C语言如何操作内存

本文详细解析C语言中内存地址的封装,包括变量名与内存的对应、数据类型长度与解析方法、指针的使用及其类型含义,以及数组管理内存的机制。通过实例揭示C语言中函数名的内存地址本质和指针的间接访问方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.4.1C语言对内存地址的封装(用变量名来访问内存、数据类型的含义、函数名的含义)

汇编在操作内存时是直接使用的内存的地址编号,如:ldr r0, = 0x11111111.
譬如在C语言中 int a; a = 5; a += 4; //a == 9
结合内存来解析C语言语句的本质:
int a; //编译器帮我们申请了1个int类型的内存格子(长度是4字节,地址是确定的,但是只有编译器知道,我们是不知道的,也不需要知道。),并且把符号a和这个格子绑定。
a = 5; //编译器发现我们要给a赋值,就会把这个值5丢到符号a绑定的那个内存格子中。
a += 4; //编译器发现我们要给a加值,a += 4 等效于 a = a + 4;编译器会先将a原来的值读出来,然后给这个值加4,再把加之后的和写入a所绑定的格子里去。
C语言中数据类型的本质含义是:表示一个内存格子的长度和解析方法。
数据类型决定长度的含义:我们一个内存地址(0x30000000),本来这个地址只代表1个字节的内存长度,但是实际上我们可以通过给他一个类型(int),让他有了长度(4),这样这个代表内存地址的数字(0x30000000)就能表示从这个数字(0x30000000)开头的连续的n(4)个字节的内存格子了(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003).
数据类型决定解析方法的含义:譬如我有一个内存地址(0x30000000),我们可以通过给这个内存地址不同的类型来指定这个内存单元格子中二进制数的解析方法。譬如(int)0x30000000,含义就是(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)这4个字节连起来共同存储的是一个int型数据;那么(float)0x30000000,含义就是(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)这4个字节连起来共同存储的是一个float型数据。
强制类型转换的意思就是说,那个内存单元的格子一开始是不变的,但是它有多长并且如何取解释它,解析它,我强制给你更改了。譬如说定义了一个地址8,是int类型的,那么把int类型的地址8强制转换为short类型,就是说,还是从地址8开始,但是不再是8,9,10,11,而是8,9了。如果强制转换为float类型,那么长度还是8,9,10,11.但是这四个格子组成的空间原本是按照int类型解析的,现在按照float 类型解析了。
C语言中,函数就是一段代码的封装,函数名的实质就是这一段代码的首地址了。所以说函数名的本质也是一个内存地址。

1.4.2用指针来间接访问内存

关于类型(不管是普通变量类型int,float等,还是指针类型int *,float *等),只要记住:类型只是对后面数字或者符号(代表的都是内存地址)所表征的内存的一种长度规定和解析方法规定而已。
C语言中的指针,全名叫指针变量,指针变量其实和普通变量没有任何区别,只是解析方法不同而已。譬如int a和int * p其实没有任何区别,a和p都代表一个内存地址(假如是0x20000000),但是这个内存地址(0x20000000)的长度和解析方法不同。a是int类型,所以a的长度是4字节,解析方法是按照int的规定来的(0x20000000开头的连续4个字节中存储的是一个int类型的数);p是int *类型,所以长度是4个字节,解析方法是按int *的规定来的(0x2000000开头的连续4个字节中存储了1个地址,这个地址所代表的内存单元中存放的是一个int类型的数)。

1.4.3指针类型的含义

见上面详解;

1.4.4用数组来管理内存

数组管理内存和变量其实没有本质区别,只是符号的解析方法不同。(普通变量、数组、指针变量其实都没有本质差别,都是对内存地址的解析,只是解析方法不一样)。
int a; //编译器分配4字节长度给a,并且把首地址和符号a绑定起来。
int b[10]; //编译器分配40个字节长度给b,并且把首元素的首地址和符号b绑定起来。
数组中第一个元素(a[0])就称为首元素;每一个元素类型都是int,所以长度都是4,其中第一个字节的地址就称为首地址,首元素a[0]的首地址就称为首元素首地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非主流的豆瓣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值