内存操作
- C存储类
有四种类型:auto、 register、 static、 extern
- Auto
auto 存储类是所有局部变量默认的存储类,auto 只能用在函数内,即 auto 只能修饰局部变量;
- Register
register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。
register int miles;
寄存器只用于需要快速访问的变量,比如计数器。
- static和extern在前面已经说过。
- 总结:
auto 是局部变量的默认存储类, 限定变量只能在函数内部使用;
register 代表了寄存器变量,不在内存中使用;
static是全局变量的默认存储类,表示变量在程序生命周期内可见;
extern 表示全局变量,即对程序内所有文件可见,类似于Java中的public关键字;
指针
- 尾端 (Endianness)
尾端由Danny Cohen(Cohen 1980)由一篇论文引入计算机界,作者注意到计算机体系结构基于字节寻址和整数定义在通信系统中的不同定义分为“大尾端”(Big-endian)和“小尾端”(Little-endian)两个阵营。一个十六进制整形数据0x12345678传递给另外一个采用不同尾端的计算机系统时可能会被理解为0x78563412甚至0x1E6A2C48。这就是尾端命题。尾端直接决定着数据在存储器内的组织形式。
- 地址空间 (Address Space)
存储器中,由存储单元地址或集合所构成的集合称为地址空间。
- 线性地址空间 (Linear Address Space)
如果一个地址空间中所有的元素可以组成一个由整数构成的唯一闭区间,则称该地址空间为线性地址空间。
- 扁平地址空间 (Flat Address Space)
一个地址空间可以由多个不同纬度的线性地址空间构成,当地址空间中只有唯一的一个线性地址空间时,或者地址空间中不同的线性地址空间可以被影射到同一个彼此不相交的纬度时,则称该地址空间为扁平地址空间。
结构体指针
一个结构体变量的指针就是该结构体变量所占据内存段的起始地址。
可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。
同时指针变量也可以用来指向结构体数组中的元素。
结构体指针变量说明的一般形式为:
struct 结构名 *结构指针变量名
例如,在前面的例题中定义了stu这个结构,如果要说明一个指向stu的指针变量pstu,可写为
当然也可以在定义stu结构时同时说明pstu。与前面讨论的各类指针变量相同,结构体指针变量也必须要先赋值才能使用
赋值就是把结构变量首地址赋予该指针变量,不能把结构名赋予该指针变量。
如果boy是被说明为stu类型的结构变量,则:
pstu = &boy;是正确的
pstu = &stu;是错误的
因为结构名和结构变量是两个不同的概念,不能混淆。结构名只能表示一个结构形式,编译系统并不对他们分配内存空间,只有当某变量被说明为这种类型的结构时,才对该变量存储内存空间。
所以以上 pstu = &stu;是错误的,不可能去取一个结构名的首地址。有了结构指针变量,就更方便地访问结构变量的各个成员。
其访问的一般形式为:
(*结构指针变量).成员名
或为:
结构指针变量->成员名
例如:(*pstu).num
或者:pstu->num