码迷,mamicode.com
首页 > 其他好文 > 详细

存储类型关键字

时间:2020-10-16 10:55:02      阅读:28      评论:0      收藏:0      [点我收藏+]

标签:结构体   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!