结构体:1.用来描述复杂数据的一种数据类型2.是一种构造类型(用户自定义类型)
定义语法:
形式1:struct 结构体名{};先定义类型,然后再利用类型定义变量。
形式2 :定义类型的同时,定义变量。还可以直接初始化变量。
struct demo{}name;
形式3:定义类型的同时,定义变量,可以省略类型名。
struct {}name; 如果结构体类型只使用一次,可以这样定义。
结构体类型的大小:
定义变量的语法: struct 结构体名 变量名;
结构体的初始化:看每个成员变量是什么类型,根据这个类型初始化。初始化顺序按照定义的顺序依次初始化。
结构体变量的引用:
结构体数据引用时,一般引用到具体的成员数据。引用到成员利用结构体成员运算符 .
使用:结构体变量名.成员名。
在利用结构体指针来引用结构体变量时,需要用到 -> 运算符。表示通过指针指向结构体成员变量。
注意:结构体类型可以用来作为变量,指针,数组,函数的数据类型。当作为数组类型时,表示每一个数组元素都是结构体类型。这时候可以用s[i].sno的方式来访问到单个结构体类型中数据。当结构体类型作为指针的数据类型时,表示该指针的基类型为结构体类型,当利用结构体指针来指向结构体数组时。可以利用 (s+i)->sno 这样的方式来访问到数组中第 i 个结构体数据中的sno数据。注意:[ ]和->的优先级相同,当利用 (s+i)->score[j]的方式访问数组第 i 个结构体元素中的score数组时,此时 [ ]和-> 的优先级相同,结合是从左到右,所以是先访问到score数组在对数组元素进行访问,所以不用对 (s+i)->score 的整体加括号。
注意:同类型的结构变量之间,可以相互赋值。
如:struct student s1;
struct student s2;
s1 = s2;
共用体:union 共用体名{};
特点:共用一块内存空间,共用的是最大的那块内存空间。
共用体初始化时只能给一个值,默认是给到第一个成员的。共用体变量中的值,取决于最后一次给到的值,还要看能影响几个字节。
对比结构体:
1.结构体中各个成员拥有自己独立的空间
2.共用体中,成员共用一块空间。
考点:用共用体判断大小端。
1.利用共用体判断大小端。
2.利用指针判断大小端。
枚举:概念:
作用:1.提高代码的可读性。
2.提高代码的安全性。
注意:列举各种值之间,用逗号隔开。
枚举中列举的值,默认是从0开始,如果有给定的值,则后续没有给值的,枚举成员依次加1;
枚举类型本质,实际是一个int类型
枚举类型的变量与整型类型的变量是一样的
与宏定义对比:1.使用阶段不同 ----宏定义在预处理阶段;枚举----编译阶段要检查语法,运行阶段参与代码运行。
2.可读性:都提高了可读性;枚举更能说明有相关性的一些值间关系。
typedef:!!不是定义类型。而是给类型起别名。
用法:typedef int a;//表示a是int类型的一个别名。
位运算://C语言特有的运算。
特点:可以直接操作二进制位。
与运算:&,运算规则为一假则假。 作用:清0
或运算:|,运算规则为一真为真。作用:置 1
取反运算:~,运算规则为真假相对。
异或运算:^,运算规则为:相同为0,不同为1。作用:加密,交换。
左移运算:<<: eg: a<<n,表示将a这个数据左移n位。左移一次,相当于数据乘2.
右移运算:>> 右移一次,相当于除2.。
逻辑右移:
算术右移:看符号位是什么。如果是有符号类型数据,右移时 ,最高位补符号位。如果时无符号类型的数据,右移时,最高位补0
注意:浮点数不能进行位运算。
指针函数:是一个函数,返回值时指针类型。
函数指针:是一个指针,指针的基类型位函数。
注意:malloc()和free()成对出现。free只是释放了空间,表示这块空间又自由了,但是空间上的数据并不会清零。
1.free()释放空间之后一般不再使用。
2.指向这块空间的指针是野指针。
3.free之后对应空间的内容也不要再使用。