结构体可以用来统一存储多个不同类型的数据
结构体仅仅是一种数据类型,它本身不占有存储位置
结构体仅仅描述了多种数据之间的关系
结构体可以用来声明结构体变量,结构体变量实际占有内存空间
声明结构体需要一个关键字struct
结构体声明中包含多个变量声明语句,这些语句不会分配变量位置,因此不能初始化
结构体声明本身可以放在头文件中
可以在声明结构体的时候立刻声明结构体变量(不建议这样做,因为声明了变量就占据了内存,就不能放到头文件中了)
可以用struct关键字和结构体名称一起作为数据类型名称来声明结构体变量
typedef关键字可以用来给数据类型起别名,例如
1 #include <stdio.h>
2 int main() {
3 struct person{
4 int id;
5 char name[20];
6 float salary;
7 };
8 typedef struct person ppp;
9 //struct person p;
10 ppp p;
11 return 0;
12 }
只能使用typedef关键字给数据类型起别名而不可以使用宏
下面例子和上面一样2-6在声明结构体的同时立刻起了一个别名,这个时候可以省略结构体本身的名称(也就是下面的例子中的person可以省略)
1 #include <stdio.h>
2 typedef struct person {
3 int id;
4 char name[20];
5 float salary;
6 } ppp;
7
8 int main() {
9 ppp p;
10 return 0;
11 }
在c语言中结构体中不可以包含函数(因为函数要占存储位置)
练习:声明一个结构体表示手机,一个手机包含一下信息(品牌,型号,价格)
声明一个结构体变量表示iphone5
1 #include <stdio.h>
2 #include <string.h>
3 typedef struct telephone {
4 char brand[20];
5 char model[20];
6 double price;
7 } phone;
8
9 int main() {
10 phone iphone5;
11 strcpy(iphone5.brand, "Apple");
12 strcpy(iphone5.model, "Iphone5");
13 iphone5.price = 2000.0;
14
15 printf("品牌是:%s
", iphone5.brand);
16 printf("型号是:%s
", iphone5.model);
17 printf("价格是:%g
", iphone5.price);
18 return 0;
19 }
结构体变量也可以初始化,初始化的语法和数组初始化的语法一样
1 #include <stdio.h>
2 #include <string.h>
3 typedef struct telephone {
4 char brand[20];
5 char model[20];
6 double price;
7 } phone;
8
9 int main() {
10 phone iphone5 = {"Apple", "Iphone6", 200000.0};
11 /*
12 strcpy(iphone5.brand, "Apple");
13 strcpy(iphone5.model, "Iphone5");
14 iphone5.price = 2000.0;
15 */
16 printf("品牌是:%s
", iphone5.brand);
17 printf("型号是:%s
", iphone5.model);
18 printf("价格是:%g
", iphone5.price);
19 return 0;
20 }
声明结构体表示屏幕上一个点,从键盘得到两个点的位置信息,并记录在两个结构体变量中,计算出这两个点的中点信息,并记录在一个新的结构体变量中,把新结构体变量的内容打印出来。
1 #include <stdio.h>
2
3 typedef struct screen {
4 int x;
5 int y;
6 } screen;
7
8 int main() {
9 screen a1 = {}, a2 = {}, a3 = {};
10 printf("请输入第一个点的位置:");
11 scanf("%d%d", &a1.x, &a1.y);
12 printf("请输入第二个点的位置:");
13 scanf("%d%d", &a2.x, &a2.y);
14 a3.x = (a1.x + a2.x) / 2;
15 a3.y = (a1.y + a2.y) / 2;
16 printf("中点的位置为:%d %d
", a3.x, a3.y);
17 return 0;
18 }
同类型的结构体变量之间可以直接赋值,不需要逐个子变量赋值