在第十四天的学习中,我们了解了自定义的数据结构、学习了位运算符。
一、数据结构
1.结构体变量
1.1结构体类型的定义
以定义一个结构体类型为例。
struct student
{
char name[32];
char sex;
int age;
int score;
};
此时我们定义了一个名为student的数据类型,在这个数据类型中包含“名字”“性别”“年龄”“成绩”,这些数据称为该数据类型的成员。
“struct”是固定的格式,代表着你定义了一个结构体变量;“student”是你定义的数据类型的名字。
1.2结构体变量的定义
继续以学生为例,接下来我们定义一个结构体变量。
struct student s = {“张三”,‘m’,20,95};
这里我们定义了一个结构体变量s,并对其进行了初始化。
“struct strdent”代表我们刚刚定义的结构体类型,s是我们定义的这个变量名。
用大括号括起来的数据会以逗号隔开,按顺序传入结构体类型的成员中。
1.3结构体元素的访问
结构体元素的访问有两种方法。
在此处我们还以刚才定义的s来举例。
方法一:
结构体变量名.成员
s.name
方法二:
定义一个指针指向变量s的地址
struct student *p = NULL; //定义一个student类型的结构体指针
p = &s; //使p指向s的首地址
p -> name; //用指针p访问s的成员name
1.4结构体的储存
结构体类型变量在储存时会对齐内存,具体表现为几个原则:
原则一:以结构体变量首地址为0计算,每个成员的首地址都会置于自身所占字节整数倍的位置
原则二:成员按在结构体内部的顺序存储
原则三:整个结构体变量所占空间会补充为成员中占最大字节空间的整数倍
2.共用体:
union 共用体名
{
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
...
};
共用体所有成员变量共享同一片空间
3.枚举:
enum 枚举类型名
{
枚举常量1,
枚举常量2,
枚举常量3,
..
};
1.枚举类型一般说明将来变量的值在给定的常量中选择其一作为它的值
2.枚举常量的值总是前一个枚举常量的值+1,第一个默认为0值
3.枚举常量默认为int类型,可以直接在程序中使用
二、位运算运算符:
& 按位与
| 按位或
^ 按位异或 相同为0 相异为1
~ 按位取反
>> 右移 右移n位 等价于 让该数 / 2^n
<< 左移 左移n位 等价于 让该数 * 2^n
与0得0
或1置1
9 & 3
0000 0000 0000 0000 0000 0000 0000 1001 &
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0001
9 | 3
0000 0000 0000 0000 0000 0000 0000 1001 |
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 1011
9 ^ 3
0000 0000 0000 0000 0000 0000 0000 1001 ^
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 1010
~9
0000 0000 0000 0000 0000 0000 0000 1001
1111 1111 1111 1111 1111 1111 1111 0110
111 1111 1111 1111 1111 1111 1111 0101
000 0000 0000 0000 0000 0000 0000 1010
9
00000000000000000000000000000001
1 << 3
00000000000000000000000000000001
00000000000000000000000000001000
按位异或实现数据交换:
a = a ^ b;
b = a ^ b;
a = a ^ b;
将变量的第n位置0:
num = num & ~(1 << n)
将变量的第n位置1:
num = num | (1 << n)