const:声明只读变量
1.const int * a; == int const *a;
*a(即所指的值)是不可以改变的,a(即所指值的地址)是可以改变的。
在编译时会出错,显示(*a)++为只读变量,不可以修改,当将这条语句注释后,会输出其值。
2.int * const a;(对于此类要先进行初始化)
*a(即所指的值)是可以改变的,a(即所指值的地址)不可以改变。
显示a为只读变量,所以 要在一开始要对a进行初始化,且不能写a++。
3.int const *const a; (要先进行初始化)
a不能修改,*a也不能修改。
volatile:对volatile变量的读写不会被编译器优化掉。
如volatile int i;则编译器不会对i进行优化,多用于硬件方面。
extern:表明变量或者函数的定义不在本文件中,或者拓展变量的使用范围。
拓展范围:
其他文件使用:
下图此时显示file2中a引用失败,因为static表明a只能在file1中使用,file2中只能重新定义。
函数也是如此,如果一个函数只能被本文件中其它函数所调用,称为内部函数(或静态函数)。定义时在函数类型前加static。
struct:多种数据组合起来的一个整体,其表现形式是一个结构体。
struct 结构体名
{
成员表列
}变量名表列;
struct结构体,只是构造出一个新的类型,并没有定义该类型的变量,因此在内存中并没有开辟任何存储空间;
1.1结构体定义(3种方法)
1).先声明结构体类型,再定义结构体变量。
2).在声明的同时定义变量
3).不指定类型名而直接定义结构体类型变量
1.2结构体变量的初始化和引用
1)在定义结构体变量时初始化
2)结构体变量名.成员名
3)嵌套定义( 注意date1必须要在stu前面定义)
4)同类结构体可以相互赋值
如下图:
一开始c的地址被instant1.cMember,然后instant1的值被赋给instant2(同类的结构体可以相互赋值),
此时1和2的指针都指向c,当2的指针修改c的值为b时
,instant1.cMember的值也会变成b
5)字符型数组不能直接赋值(要是用strcpy函数)
1.3 结构体数组的使用
struct 结构体名
{
成员表列
}数组[数组长度];
1.4结构体指针
1.指向结构体变量的指针:
不能用指向结构体变量的指针指向该结构体变量的某个成员。
访问结构体变量的三种方法:
注意:
2.字对齐问题
int型变量占四个字节,char占1个字节,后一个变量若能在前一个变量分配的空间中存放下,则后一个变量不再重新分配空间。
字对齐:申请的空间为4的倍数。(结构体存储方式)
半字对齐:申请的空间为2的倍数
union:当多种类型,多个对象,多个事物只取其一时
通过共用体查看字节序:
CPU存取数据都是从低地址开始开始存放,一个变量占用的内存空间往往不止一个字节,但是不同类型的CPU存放数据的顺序不同,因而产生了字节序的概念,按存放顺序的不同分为大端字节序和小端字节序两种:
大端字节序: 数据的高字节位存储在低地址对应的存储单元;
小端字节序:数据的低字节位存放在低地址对应的存储单元。
用共用体查看计算机的字节序:首先union有两个成员,分别为int,char,当int占用时会分配四个字节,而char占用时会分配1个字节,且将int赋值为1便于观察。当计算机为大端字节序时:输出为0,当为小端字节序时,输出为1
enum:枚举类型
enum默认初始化是在前一个成员的值上加1,若第一个成员的值没有,默认为0.可作为switch的标签。