C语言的结构体
OK,这次我们来聊聊结构体。
任务来了,我想让你给学生建立一个数据库,该怎么来做。
这个学生包含的信息如下:
- ID:也就是学号,唯一区别码,用整型表示
- Name:姓名,用字符串表示
- Age:年龄,用整型表示
- Sex:性别,用字符串表示
按照目前学过的知识我们的代码如下,比如先来一个李雷同学的吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <stdio.h>
int main() { int lilei_id = 1; char lilei_name[15] = "Li Lei"; int lilei_age = 18; char lilei_sex[10] = "male";
printf("The student information :\n"); printf("ID \t | Name \t| Age\t| Sex \n"); printf("%d \t | %s \t| %d \t| %s \n", lilei_id, lilei_name, lilei_age, lilei_sex);
return 0; }
|
好,刚开学没几天,来了另外一个同学,韩梅梅,从此浪漫的爱情,不,英语学习开始,我们把数据库更新一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <stdio.h>
int main() { int lilei_id = 1; char lilei_name[15] = "Li Lei"; int lilei_age = 18; char lilei_sex[10] = "male";
int hanmeimei_id = 2; char hanmeimei_name[15] = "Han Meimei"; int hanmeimei_age = 17; char hanmeimei_sex[10] = "female";
printf("The student information :\n"); printf("ID \t | Name \t| Age\t| Sex \n"); printf("%d \t | %s \t| %d \t| %s \n", lilei_id, lilei_name, lilei_age, lilei_sex); printf("%d \t | %s \t| %d \t| %s \n", hanmeimei_id, hanmeimei_name, hanmeimei_age, hanmeimei_sex);
return 0; }
|
发现了什么问题,是不是跟自定义函数类似,代码是简单,不过大部分都是重复的工作,没有显示度,没有创新。
如何办,C语言提供了一个结构体,允许用户自己建立由不同类型数据组成的组合型的数据结构,注意是不同类型,不同类型。
重要的事情说三遍。
先看一下结构体的声明吧,看看是何方神圣:
1 2 3 4 5 6
| struct tag { member1 member2 member3 ... } list ;
|
具体是个什么含义:
- struct:是结构体的声明类型
- tag:是这个结构体的标记;
- member:就是结构体的内容
- list:是变量的列表
来个实例化吧,比如学生的定义就可以写成如下:
1 2 3 4 5 6
| struct Student{ int id; char name[10]; int age; char sex[10]; }student;
|
从这个代码可以看出,结构体的tag首字母一般大写,结构体的内容类型不一样,结构体有个列表叫做student。
下面我们使用结构体来重构代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <stdio.h>
int main() {
struct Student { int id; char name[15]; int age; char sex[10]; };
struct Student lilei = {1, "Li Lei", 18, "male"}; struct Student hanmeimei = {2, "Han Meimei", 17, "female"};
printf("The student information :\n"); printf("ID \t | Name \t| Age\t| Sex \n"); printf("%d \t | %s \t| %d \t| %s \n", lilei.id, lilei.name, lilei.age, lilei.sex); printf("%d \t | %s \t| %d \t| %s \n", lilei.id, lilei.name, lilei.age, lilei.sex);
return 0; }
|
有没有感觉,神清气爽,两袖清风,原来8行的代码,2行搞定,也就多了一个结构体的定义,在学生数以万计的时候,代码量减少了四分之三,这是在只有4个参数的情况下,参数越多越给力。
有几点说明:
- 注意结构体的定义,有大括号,有分号
- 注意结构体的初始化,需要使用struct Student s1这样的表示方式;
- 注意结构体的初始化也是使用大括号,对应每个变量
编译运行
直接输入make
就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ALL : struct1 struct2 struct3
struct1: struct1.c gcc -o struct1 struct1.c
struct2: struct2.c gcc -o struct2 struct2.c
struct3: struct3.c gcc -o struct3 struct3.c
.PHONY : clean
clean: rm -f struct1 struct2 struct3
|
运行输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| $ ./struct1 The student information : ID | Name | Age | Sex 1 | Li Lei | 18 | male
$ ./struct2 The student information : ID | Name | Age | Sex 1 | Li Lei | 18 | male 2 | Han Meimei | 17 | female
$ ./struct3 The student information : ID | Name | Age | Sex 1 | Li Lei | 18 | male 2 | Han Meimei | 17 | female
|