一切都是地址

C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。

数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。

CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。如果程序不小心出错,或者开发者有意为之,在 CPU 要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序崩溃,程序员没有挽救的机会。

CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。

假设变量 a、b、c 在内存中的地址分别是 0X1000、0X2000、0X3000,那么加法运算c = a + b;将会被转换成类似下面的形式:

0X3000 = (0X1000) + (0X2000);

( )表示取值操作,整个表达式的意思是,取出地址 0X1000 和 0X2000 上的值,将它们相加,把相加的结果赋值给地址为 0X3000 的内存

变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。

需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。

最新文章

  1. MIT 6.824 : Spring 2015 lab3 训练笔记
  2. wcf测试证书的创建
  3. CodeForces 689B Mike and Shortcuts (BFS or 最短路)
  4. FileUpload V2.1详细
  5. LeetCode 笔记26 Single Number II
  6. xmind的第二天笔记
  7. Android InputMethodManager输入法简介
  8. 三大跨平台网盘--dropbox
  9. D3.js:力导向图
  10. idea xml版本修改问题
  11. 前端mock数据的几种方式
  12. printf 汇总
  13. h5调用微信分享
  14. 【图像处理】Schmid滤波器
  15. 001_Mac键盘图标与对应快捷按键标志汇总
  16. 【BZOJ-1194】潘多拉的盒子 拓扑排序 + DP
  17. 洛谷P1613 跑路 图论
  18. 朴素贝叶斯算法原理及Spark MLlib实例(Scala/Java/Python)
  19. 入门系列之在Ubuntu 14.04上备份,还原和迁移MongoDB数据库
  20. [NOI2010] 能量采集 (数学)

热门文章

  1. Java处理Excel中的日期格式
  2. ICCV2019论文点评:3D Object Detect疏密度点云三维目标检测
  3. iOS视频硬编码技术
  4. 作为一名双非本科毕业的Java程序员,我该如何在日益严重的内卷化中避免被裁?
  5. Idea快捷键大全(Windows)
  6. CENTOS7 安装 SYNCTHING
  7. 重磅!GitHub官方开源新命令行工具
  8. NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」
  9. [INS-32033] Central Inventory location is not writable
  10. 精尽Spring Boot源码分析 - 序言