初始指针(内存和地址、变量、程序运行)

如果事先对指针和地址的概念有所了解,就会快很多;但是仅懂得内存和地址,是无法掌握指针的。

地址和内存

现在的计算机主要将动态随机存取存储器(DRAM)用作主储存器,DRAM又称为“动态RAM”,它可以根据一种非常小的电容的充电情况(充电或未充电)*来表示数据是0还是1.

*由于电容太小,因而电能过一段时间就会释放殆尽,所以需要定期重写(刷新),动态RAM就是由此而来。

为了对内存进行读写,必须指定要访问的是庞大的内存空间里的哪个位置,这时使用的就是地址(address)。现在仅考虑以下情况:内存中的每个字节都有一个地址,地址编号从0开始顺序递增*

*实际上,这种地址是 物理地址 ,与现代计算机中程序员一般使用的地址(虚拟地址)是不同的。

虽然1字节(8位)只能表示0~255的数,但只要增加1位,可表示的数就会倍增,所以可以将多个字节组合起来,比如使用2字节(16位)表示0~65 535的数,使用4字节(32位)表示0~4294 967 295。

由于地址也是由二进制数组成的,所以32位计算机只有4GB的寻址能力;今年来64位计算机的寻址能力可达2^64字节,即约1680万太字节(TB);


地址和变量

C程序里使用的变量值是保存在内存中的。也就是说,各个变量都被分配了某个地址的内存,向变量赋值,就是值保存在这个地址的内存中。

在C语言中,用来保存变量的内存上的空间叫做对象(object),而被保存为对象的数据类型(比如int,double)叫做 对象类型*

*数组和指针也是对象类型


地址和程序运行

大家用C语言所写的代码,在编译后生成的机器码程序(可执行文件 executable file)可能一度是保存在硬盘* 上的,但到了要执行的时候,就会被放到内存里。

* 最近比较常见的或许是SSD(Solid State Drive,液态硬盘)

然后,CPU一边读取保存在内存里的机器码程序,一边按顺序执行。

由于程序是按顺序执行的,所以就需要有能够表示现在正在执行的是哪个地址的机器码命令的计数器,我们称之为 程序计数器(program counter)。程序计数器一般是每执行一个命令就加1,然后就指向下一个命令,但在有条件分支或者循环时,它就会突然增加以跳过某些命令,或者突然减小以回到之前的位置。

个人理解:在循环中碰见break会增加跳出循环;在循环不符合条件的情况下返回循环开头;

while{表达式}{

...
break;

}        

在程序引用变量值, 或者把值保存到变量中时, CPU会对保存变量的地址所指向的内存进行读写*。

* 在如今的计算机中,在CPU和主存储器之间还存在多段缓存(cache)。缓存的访问速度很快,但因为比较昂贵,所以容量很小。

在CPU内部有一种被称为 寄存器(register) 的部件,类似于机器语言中的变量。CPU对寄存器的访问速度比对主存储器的访问速度快得多,但寄存器数量很少,所以通常用来保存访问频率极高的变量,或者计算过程中的临时数据。其中,访问频率极高的变量是通过编译器的优化自动分配给寄存器的。

有些寄存器具有特殊意义,例如前面提到的程序计数器也是一个寄存器。

Guess you like

Origin blog.csdn.net/weixin_60154963/article/details/120961325