深入理解C语言指针:概念、操作与应用
1. 内存与内存寻址基础
在计算机运行的所有程序和数据都存储于内存之中。当我们运行一个程序时,它会从磁盘读取并加载到内存,形成执行流;读取磁盘、光盘或闪存驱动器中的文件时,数据首先会被读入内存,再从内存中访问。所有调用和执行的函数、声明的变量、结构体和数组等,都在内存中有各自的位置,并且计算机中可读写的部分都可通过预定义的内存位置进行访问。
内存中的每个字节都有可寻址性,内存地址是值、函数或设备的起始位置。对于运行的程序而言,内存被视为连续的字节块,每个字节都有从1到计算机上最大无符号整数值的唯一地址。地址0具有特殊含义。
不同计算机的地址空间有所不同:
- 若计算机使用4字节表示无符号整数值,其内存地址空间为1到4,294,967,295字节,即约4GB,这被称为32位地址空间。如今大多数计算机的内存远超4GB,因此32位地址空间往往不足。
- 若计算机使用8字节表示无符号整数值,其内存地址空间为1到18,446,744,073,709,551,615字节,即超过18 quintillion字节,这被称为64位地址空间。64位地址空间可容纳的内存远超当前及可预见未来计算机的物理内存。
操作系统会将虚拟地址空间映射到较小的物理地址空间,并根据需要进行管理。64位地址空间为程序提供了极大的工作空间,适用于模拟亚原子反应、对大型结构进行有限元分析、模拟喷气发动机性能或星系天文模型等需要巨大地址空间的程序。不过,目前我们无需担心地址空间的限制问题。
2. C语言中指针的内存管理与访问
C语言为程序提供了在物理地址空间中分配、释放和访问虚拟内存的方法,而物理内存的管理