第八章 构造数据类型
1. 结构体
1.结构体的定义
truct 类型名
{
数据类型 成员变量名1;
数据类型 成员变量名2;
数据类型 成员变量名3;
};
struct date
{
int year;
int mon;
int day;
};
struct time
{
int hour;
int min;
int sec;
};
// 定义一个类型
struct Stu
{
char name[50];
int age;
char sex;
int score;
};
2.定义结构体变量
int a;
struct 结构体名 变量名;
struct Stu zhagnsan;
3.初始化
// 全部初始化
struct Stu s ={"zhangsan",20,'m',90}; // struct stu
// gnu(gcc) 局部初始化
struct Stu s2 = {
.name="zhagnsan",
.score = 80,
};
struct Stu s3={0};
4.变量的访问
struct Stu s ={"zhangsan",20,'m',90}; // struct stu
// gnu(gcc) 局部初始化
struct Stu s2 = {
.name="zhagnsan",
.score = 80,
};
1.通过变量访问成 使用 . 运算符
s.age = 22; // int
strcpy(s.name ,"zhang123"); // char []
printf("name:%s age:%d sex:%c score:%d\\n",s.name,s.age,s.sex,s.score);
2.通过指针访问 , 使用 -> 运算符
struct Stu * p = &s; // struct stu
printf("name:%s age:%d sex:%c score:%d\\n",p->name,p->age,p->sex,p->score);
5.结构体的存储
字节对齐问题:
由于结构体是 自定义类型, 成员变量根据需要来定义的。 cpu(32bit)在访问数据 ,都是以4字节为单位读写,效率高。 自己定义成员变量的相对地址,不一定在4字节对齐的地址。 编译器就会帮你把成员变量的地址,扩展到4字节对齐的地方。 那么结构体的大小,就变大了。
结构体成员必须存放在内存地址为自身类型大小的整数倍的内存地址
找到结构体中,成员变量占用内存最大的。 那么结构体的总大小,应该 最大成员占用内存大小的整数倍。
struct Stu
{
char name[30];
int age;
short ID;
double cost;
}; // 30 + 4 +2 +8 = 44

结构体参数的传递
struct Stu
{
char name[30];
int age;
char sex;
double score;
};
void input_stu(struct Stu* p)
{
printf("input name;");
gets(p->name); // zhagnsan\\n
printf("input age:");
scanf("%d",&p->age); // 20\\n 输入缓冲区
getchar();
printf("input sex:");
scanf("%c",&p->sex); // 输入缓冲区 \\n
printf("input score:");
scanf("%lf",&p->score);
}
void show_stu(const struct Stu* p)
{
printf("name:%s age:%d sex:%c score:%lf\\n"
,p->name,p->age,p->sex,p->score);
}
int main()
{
struct Stu s;
input_stu(&s);
show_stu(&s);
return 0;
}
结构体数组的使用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stu
{
char name[30];
double heigh;
};
int main()
{
struct Stu a[3]={0};
struct Stu a2[3]={
{"zhangsan",1.77},
{"lisi",1.65},
{"wangmazi",1.22}
};
// gnu
struct Stu a3[3]={
[1]={
.name="zhangfei",
}
};
//a = a2;
strcpy(a[0].name,"aaa");
a[0].heigh = 1.111;
a[1] = a[0]; // 结构体变量与结构体变量 之间可以直接复制。
int i = 0 ;
for(i=0;i<3;i++)
{
printf("id:%d name:%s heigh:%lf\\n ",i,a2[i].name,a2[i].heigh);
}
}
2.共用体 ,相对与结构体 用的少
共用体,是为了在早期计算机中,节省内存的 ,一个自定义结构。
-
也叫联合体,成员变量的内存空间是共享的。
-
结构体中,每个成员变量的内存空间是独立的。
-
函数参数传递 ,
定义的语法
union 共用体名字
{
数据类型 成员变量1;
数据类型 成员变量2;
数据类型 成员变量3;
数据类型 成员变量4;
。。。
};
cpu 的字节顺序
大端存储 , 51,网络 。数据的低位在内存的高地址。数据的高位在内存的低地址。
小端存储 ,arm,intel , 数据的低位在内存的低地址。数据的高位在内存的高地址。

3.枚举类型
把变量的取值范围,一个个列举出来。 那么变量只能在这个范围内取值。 列举出来的值,被称为枚举值 。类型当作整形(int)常量
1.枚举出来一些常量
定义的语法
enum 枚举类型名 {枚举值列表};
enum WEEK {MON,TUE,WED,THU,FRI,SAT,SUN}; 枚举值默认从0开始 ,枚举值的类型 int 常量
enum WEEK {MON=2,TUE,WED,THU,FRI,SAT,SUN}; 枚举值默认从2开始, 后一个枚举值,在前一个枚举值的基础上+1
int main()
{
enum WEEK w = FRI; // 变量定义+ 初始化
w = SUN; // w 的类型 是 int
switch(w)
{
case MON:
case TUE:
case WED:
printf("好好学习\\n");
break;
case THU:
case FRI:
case SAT:
printf("放飞自我\\n");
break;
case SUN:
printf("放飞自我*2\\n");
break;
}
w =100 ; // 注意枚举子啊赋值的时候不要超出范围。 gcc不会有报警,逻辑上有潜在的错误。
return 0;
}
第九章 位运算
先把数据转换为 2进制 , 在对2进制位进行相关操作(与,或 非等)。
1.位运算
可以操作整形的数据, char , int ,short ,long
| & | 按位与 , 1&1 == 1 操作的是 对应数据的二进制位 | 双目 |
| | | 按位或 1|0 ,0|1 ==1 | 双目 |
| ^ | 按位异或 对应的二进制位不同 结果为1 | 双目 |
| ~ | 按位取反 对应的二进制位原来是0 则是1 ,如果原来是1的话,结果0 | 单目 |
| << | 逻辑左移 | |
| >> | 逻辑右移 |


网硕互联帮助中心






评论前必须登录!
注册