鱼C论坛

 找回密码
 立即注册
查看: 16|回复: 2

[已解决]c语言指针和汇编语言之间的关联性

[复制链接]
发表于 2026-9-4 23:02:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
C 语言指针与汇编语言的内存操作之间啥关系,同时在学两个教程
最佳答案
2026-9-4 23:04:29
C 语言指针本质上是对汇编内存地址的高层封装。汇编直接操作原始内存地址,没有数据类型概念;C 指针保存内存地址,额外增加类型信息,所有指针相关操作经过编译器处理,最终转换为汇编的寻址、读写、偏移运算。

举一段 C 示例代码:

```
int a = 10;
int *p = &a;   //取地址
*p = 30;       //解引用写内存
p = p + 1;     //指针运算
```

1. **取地址 `&a`**`&a` 获取变量 a 的内存地址,存入指针变量 p。编译到汇编,就是把变量 a 的内存起始地址,复制给寄存器或者栈上的 p 存储空间。这个地址就是汇编直接使用的内存编号。
2. **解引用 `*p = 30`**`*p`代表访问 p 中存储的地址对应的内存单元。对应汇编指令类似 `mov [ebx], 30`。寄存器 ebx 存放的就是 p 保存的地址;汇编里方括号`[]`就代表访问该地址指向的内存,等价 C 语言的解引用`*p`,完成内存写入。
3. **指针运算 `p = p + 1`**
C 中 int 占 4 字节,`p+1`不是地址 + 1,而是地址 + 4。这个乘以类型大小的计算,是 C 编译器完成的。汇编本身不知道 int 类型,只会直接执行地址数值加 4。
4. 二者核心区别
C 指针携带类型,编译器会做类型检查、自动计算偏移;汇编只有裸地址,只按字节处理内存,没有类型语义。
总的来说:指针是 C 给开发者提供的抽象,底层全部依赖汇编的内存寻址机制实现。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-9-4 23:02:16 | 显示全部楼层
C 语言的指针,说白了就是“内存地址的化身”。在汇编语言里,你直接跟地址打交道,比如把某个地址里的数取出来,或者把数写到某个地址去。指针就是把这些底层操作包装成了高级语言的语法。


  • 指针变量本身:它就是一个用来存放内存地址的变量。在汇编里,相当于你用一个寄存器或内存单元保存了一个地址值。
  • 解引用(*p):当你写 *p = 10 时,汇编做的就是“间接寻址”——先找到 p 里存的地址,再往那个地址里写入 10。
  • 取地址(&a):当你写 int *p = &a 时,汇编会计算变量 a 的地址,然后把这个地址值赋给 p。


举个简单的对照例子:


  1. C 语言:
  2. int a = 5;
  3. int *p = &a;
  4. *p = 10;
复制代码


对应的汇编思想(伪代码):

  1. mov [a的地址], 5      ; a = 5
  2. lea rbx, [a的地址]     ; p = &a,把a的地址装入rbx
  3. mov [rbx], 10         ; *p = 10,往rbx里存的地址处写入10
复制代码


所以,学汇编能帮你彻底看清指针的本质:指针就是地址,*p 就是“按地址访问内存”。反过来,理解了指针,看汇编里那些 mov eax, [ebx] 之类的间接寻址,也会更亲切。两个一起学,正好互相印证。[/quote]

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-9-4 23:04:29 | 显示全部楼层    本楼为最佳答案   
C 语言指针本质上是对汇编内存地址的高层封装。汇编直接操作原始内存地址,没有数据类型概念;C 指针保存内存地址,额外增加类型信息,所有指针相关操作经过编译器处理,最终转换为汇编的寻址、读写、偏移运算。

举一段 C 示例代码:

```
int a = 10;
int *p = &a;   //取地址
*p = 30;       //解引用写内存
p = p + 1;     //指针运算
```

1. **取地址 `&a`**`&a` 获取变量 a 的内存地址,存入指针变量 p。编译到汇编,就是把变量 a 的内存起始地址,复制给寄存器或者栈上的 p 存储空间。这个地址就是汇编直接使用的内存编号。
2. **解引用 `*p = 30`**`*p`代表访问 p 中存储的地址对应的内存单元。对应汇编指令类似 `mov [ebx], 30`。寄存器 ebx 存放的就是 p 保存的地址;汇编里方括号`[]`就代表访问该地址指向的内存,等价 C 语言的解引用`*p`,完成内存写入。
3. **指针运算 `p = p + 1`**
C 中 int 占 4 字节,`p+1`不是地址 + 1,而是地址 + 4。这个乘以类型大小的计算,是 C 编译器完成的。汇编本身不知道 int 类型,只会直接执行地址数值加 4。
4. 二者核心区别
C 指针携带类型,编译器会做类型检查、自动计算偏移;汇编只有裸地址,只按字节处理内存,没有类型语义。
总的来说:指针是 C 给开发者提供的抽象,底层全部依赖汇编的内存寻址机制实现。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-9-18 19:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表