数据类型
enum
枚举,为一个变量定义一组命名的整数常量,或者更简单点就是给一组变量(一般是相关的)起一个统一的名字,这一组变量在其中就会有一个对应的整数常量,从0开始依次递增,也可显式指定,之后的依次递增,可以用这个名字.变量名的格式进行使用,对应的整数值主要是为了内部表示和可能的类型转换,不要用整数表示其中的变量名,枚举成员是具有特定的含义和类型的命名变量,他们只是和底层整数值相关联。
struct
结构体,可以说是其他类型的组合体,定义一个结构体,其中可以放入除了本身外的其他数据类型的变量,定义时要确定好其所需要的空间大小,这时本身还没有确定空间大小,如果其中有包含了本身的结构体不就相当于死循环出不来了(可以放个结构体指针),一个人由姓名、性别、年龄等属性构成的,同理结构体就是由其中的变量(结构体成员)组成的,这一块和C++中的类class很类似,意思上差不多,细节上有不同。结构体定义好后便成了一种自定义的数据类型,用法和其他数据类型一样,就是在创建结构体变量时其中已经包含了各种自定义好的变量,而这些需要使用结构体变量名.结构体成员的格式进行初始化,如果结构体成员中包含指针则有可能情况就较为复杂了,之后记录。
union
联合体,与struct不同的是允许不同的数据成员共用一块内存空间,因此同时只能存储一个数据成员的值,每次只能给一个成员赋值,赋新的值只会覆盖之前的值,可以理解赋值时是为这块空间放入了内容,只是根据要赋值的成员的类型对其进行不同的解释。
typedef
给一个数据类型重新取名,也就是取个别名,简化代码的编写,提高代码的可读性和可维护性,比如修饰一个变量的前缀太长时可以起一个别名。
存储类
auto
自动变量,在C99标准之前,auto主要用于存储类变量的说明,默认情况下函数内部声明的局部变量赋值就是auto存储类的,代表着它们在函数调用时分配内存,在函数返回时释放内存(即在栈上分配空间),一般不用显式的使用,局部变量默认就是auto的。
static
静态的,简单来说static修饰的变量在整个程序运行过程中都存在且其它源文件不可见,不释放空间,static修饰的函数无法被其它文件获取,此关键字很重要也相对复杂,后续补充。
extern
外部引入,连接不同的源文件中的变量或函数,在一个源文件中extern一个其它源文件才有的变量或函数(要注意这个变量有无static修饰,如有static则extern会报错找不到该变量或函数)之后的代码就可以使用这个变量或函数了。
rigister
寄存器变量,定义变量时在变量前加上rigister修饰表明这个变量被放在寄存器中,是无法获该变量的地址的,好处是存取时速度相对从内存或硬盘存取更快一点,但不可多用,计算机的寄存器并不多;如果图快把变量都修饰为寄存器变量,编译器无法将所有声明的寄存器变量都存储在寄存器里,一部分还是会放在内存中,而且为了使程序员更加清楚程序和内存的情况往往需要明确各个变量的情况特别是地址,但寄存器变量具有无地址性,综合硬件条件、编译器以及无地址性一般不用或尽量少用。
其它
const
只读,const修饰变量表明该变量只读,不可修改(用指针可破除),存放在内存的只读数据段(rodata),称为只读变量(和常量区分),const修饰函数表明该函数内对变量只读,不会对变量进行修改。
volatile
防止编译器优化,常用于嵌入式C语言中,外部硬件状态可能会变化,如连接、未连接或硬件损坏等,编译器可能会对频繁访问的变量进行优化缓存到寄存器,但是硬件状态发生变化的话程序还会从寄存器取出这个被优化后的存到寄存器的值,这时两边状态是不对应的,变量用volatile修饰则可避免优化。
sizeof
获得数据类型的空间大小,不同的平台,数据类型的大小可能不同,一般在使用一个新平台前会使用sizeof测一下该平台的各个基本数据类型所占的空间大小,另外在运算中也常会用到sizeof,比如获取数组的空间大小。
大部分个人练手项目用到的较少,公司成型项目频繁使用,在确定性、安全性还有避免二义性等方面十分重要。
标签:变量,数据类型,C语言,关键字,static,其他,寄存器,修饰,函数 From: https://blog.csdn.net/m0_71936409/article/details/144930074