C语言中变量与值的绑定机制及指针、结构体相关疑问
关于C语言中变量与值的绑定及指针/结构体的存储逻辑
嘿,咱们一步步拆解你的问题,先从C语言里变量和值的绑定逻辑说起:
变量与值的绑定本质
在C语言里,变量其实是内存地址的“别名”——编译器会把你定义的变量名,映射到一块分配好的内存单元。当你写int num = 4;时,本质是:
- 向内存申请一块能容纳
int类型数据的空间(通常4字节,取决于系统) - 将数值
4写入这块空间 - 把
num这个名字和这块空间的起始地址绑定,后续你用num的时候,编译器就会自动帮你找到对应的内存地址去读写数据
你的指针示例逻辑:大体正确,但有两个关键补充
你的表格逻辑完全符合内存存储的基本规则,但要注意两个细节:
- 真实内存地址不是
0001这种简化的数字,而是十六进制格式(比如64位系统下是0x7ffeefbff5ac这样的16位十六进制串,32位是8位),这是计算机内存地址的标准表示方式 - 不是所有变量都有内存地址!如果编译器做了优化(比如把局部变量放到CPU寄存器里,或者用
register关键字声明变量),这类变量就没有对应的内存地址,你没法用&运算符取它的地址
咱们用真实地址格式重新梳理你的代码示例:
1. 执行int num = 4;后的内存映射
| VARIABLE | ADDRESS | ADDRESS | VALUE |
|---|---|---|---|
| num | 0x7ffeefbff5ac | 0x7ffeefbff5ac | 4 |
2. 接着执行int* num_p = #后的内存映射
| VARIABLE | ADDRESS | ADDRESS | VALUE |
|---|---|---|---|
| num | 0x7ffeefbff5ac | 0x7ffeefbff5ac | 4 |
| num_p | 0x7ffeefbff5a8 | 0x7ffeefbff5a8 | 0x7ffeefbff5ac |
3. 再执行int** num_pp = &num_p;后的内存映射
| VARIABLE | ADDRESS | ADDRESS | VALUE |
|---|---|---|---|
| num | 0x7ffeefbff5ac | 0x7ffeefbff5ac | 4 |
| num_p | 0x7ffeefbff5a8 | 0x7ffeefbff5a8 | 0x7ffeefbff5ac |
| num_pp | 0x7ffeefbff5a4 | 0x7ffeefbff5a4 | 0x7ffeefbff5a8 |
这个链式存储逻辑完全成立,多级指针就是这样层层指向的。
结构体变量的情况:逻辑完全适用
不管变量是基础类型(int、char等)还是结构体,内存存储的逻辑都是一致的:
结构体变量本质是一块连续的内存空间,它的地址就是这块空间的起始地址。举个例子:
struct Person { int age; char name[20]; }; struct Person p = {25, "Alice"};
p作为结构体变量,会被分配一块连续内存(大小是sizeof(int) + 20字节),&p拿到的就是这块内存的起始地址- 如果定义
struct Person* p_ptr = &p;,p_ptr这个指针变量会存储p的起始地址,和int指针的逻辑完全一样 - 甚至结构体的成员,比如
p.age的地址是p的起始地址偏移0字节,p.name的地址是p的起始地址偏移sizeof(int)字节,这也完全符合内存地址的映射规则
内容的提问来源于stack exchange,提问作者NetherGranite
相关产品推荐
相关产品推荐

