标签:结构体 ack 自动变量 作用 处理器 变量 实现 外部 联合
变量的存储类型是指存储变量值得存储器类型。
C语言中变量可以存放在3个地方:普通内存
运行时的堆栈(堆栈也是内存,只是用来暂存数据内容变化非常频繁)
CPU内部的通用寄存器
注意:程序员不能修改全局变量的存储类型,它只能是静态的。
1.auto关键字=基本不用
2.register关键字=现在编译器会自动分配
注意:如果一个自动变量被编译器分配到CPU内部的寄存器存储,对这个变量使用&运算符取地址往往无意义,因为在许多机器的硬件实现中,并不为寄存器指定与外部存储器统一编址的地址。
3.static关键字
3个不同的用途:
a.用于函数内部的局部变量声明时,static关键字的作用是改变局部变量的存储类型,从自动变量改为静态变量,该局部变量不再存储在堆栈或寄存器中,而是编译时由编译器分配一个静态地址空间,但此变量的作用域不受影响,依然仅局限在声明它的函数内部才可访问。
b.用于函数定义时,此函数就只能在定义改函数的C文件中引用,该C文件外的代码将无法调用该函数。
c.用于全局变量的声明,作用类似于函数,此全局变量的作用于将局限在声明该变量的C文件内部,C文件之外的代码将无法访问这个变量,如果采用指针的方式进行访问是可以的
4.extern关键字
两种使用方式:
一种是在C文件中直接声明某个其他文件中定义的函数或者全局变量为extern,从而告诉编译器这个函数或者变量是在其他C文件中定义的
二是在头文件中声明某个函数或变量为extern,然后在需要引用该函数或者变量的C文件中包含该头文件。
5.struct关键字
结构是由若干(可不同类型的)数据项组合而成的复合数据对象,这些数据项成为结构的成分或成员。
a.位域
位域是把一个一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域都有域名,允许在程序中按域名进行操作。这样可以把几个不同的对象用一个字节的二进制位域来表示。位域的定义和位域变量的说明位域定义与结构定义相仿
形式:
struct 位域结构名
{位域列表};
例:
struct pack{
unsigned a:2;
unsigned b:8;
unsigned c:6;
} pk1, pk2;
结构变量pk1或者pk2的3个成员将总共占用16位存储,气质a占用2位,b占用8位,c占用6位。
注意:一个位域必须存储在同一个字节中,不能跨2个字节。当1个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
例:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*从下一单元开始存放*/
unsigned c:4
}
位域的长度不能大于1个字节的长度,也就是说不能超过8位二进制位。
b.结构体内部的成员的对齐
在计算机结构体长度(尤其用sizeof)时,需要注意根据不同的编译器和处理器,结构体内部的成员有不同的对齐方式,这会引起结构体长度的不确定性。
字节对齐的戏精和编译器实现相关,但一般而言应满足以下3个准则:
1)结构体变量的首地址能干被其最宽基本类型成员的大小所整除;
2)结构体每个成员相对于结构首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节
3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
6.union关键字
联合变量的所有成员共享同一片存储区,因此,一个联合变量在每个时刻里只能保存它的某一个成员的值。
标签:结构体 ack 自动变量 作用 处理器 变量 实现 外部 联合
原文地址:https://www.cnblogs.com/linansimida/p/13821805.html