- 一、结构体
- 任意由程序员定义出来的新类型
- struct Student(Google编程规范)结构体的名字首字母大写strnct Student为类型名,strnct Student为类型名
- 结构体赋值与初始化
- 初始化多个成员
- 结构体传参用指针传参
- 结构体亦可以通过指针进行传参,通过指针传参只需要8个字节,而如果通过值传递需要原有结构体那么大的空间,指针传参效率更高
- 结构体亦可以通过指针进行传参,通过指针传参只需要8个字节,而如果通过值传递需要原有结构体那么大的空间,指针传参效率更高
- 结构体对齐规则
- 结构体按照其最长成员大小对齐,意味着最终的大小必须是最大成员大小的整数倍
- 结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数,从小到大依次定义,所占字节数最少
- 如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐
- 二、共用体
- 共用体:(公用内存)与结构体的用法很像,都需要自定义
- 在共用体内的成员,会共同占有相同的内存空间,内存中,叠在一起。都是往前挤第一块内存空间,所以他们的地址值是一样的
- 彼此之间,相互重叠覆盖,因此共用体中的有效元素只是最后传进去的变量的值
- 作用:判断计算机是大端还是小段
- 两种判断大小端的方法:
- 通过写入一个数,读取这个数的低位判断
- 通过共用体判断
- 共用体变量可以作为函数参数传递
- 通过指针传参
- sizeof共用体的长度,按共用体中长度最大的来,但当字节数为奇数时,依然要按照两个字节对齐,提高运行效率
- 共用体:(公用内存)与结构体的用法很像,都需要自定义
- 三、枚举(enum)
- 列举所有的可能性
- enum 变量名
- {
- 枚举的元素 (为常亮)
- };
- 枚举与int型兼容,在计算内存时按照整形变量计算,枚举只能枚举整形或者与整形兼容的类型
- 四、typedef 定义类型
- 给已有的类型名起别名,eg.从此以后,INT不再是一个变量名,而是一个类型名
- 五、位运算
- 位运算符中除“~”以外,均为二目运算符,即要求两侧各有一个运算量
- 运算量只能是整形或字符型的数据,不能为实型数据
- 按位与(&)
- 作用是指定位置清零,其他位置不变
- 按位或(|)
- 指定位置1,其他位置不变
- 按位异或(^)
- 指定位置翻转(取反)
- 应用:不定义中间变量交换两个数
- 将一个数与同一个数异或两次,仍会得到这个数本身
- 取反(~)
- 左移(<<)
- 抛掉最高位,在后面补零
- 左右移的优先级低于算术运算,又高于与,或的优先级
- 右移(>>)
- 右移与左移移动的方向相反
- 右移运算分为算术右移和逻辑右移
- 逻辑右移和左移一样都是补零
- 但如果要移动的数据类型是有符号的数据类型
- 那么补什么数要看原来的数是正数还是负数
- 将变量的第n位置0:
- num = num & ~(1 << n)
- 将变量的第n位置1:
- num = num | (1 << n)
- 给已有的类型名起别名,eg.从此以后,INT不再是一个变量名,而是一个类型名