C语言零基础入门-结构体-01
这节课的主要内容:
1,什么是结构体。
2,结构体的定义以及使用。
1. 什么是结构体
这个问题就变得有意思了,为什么呢?因为他可以与我们之前的学习紧密相关了。
在前面我们学习过许许多多的数据类型大家应该还记得吧,比如:int整形,char字符型,float浮点类型等等。
学习的时候我解释过什么是数据类型。数据类型就是:数据+数据可以执行的操作。
举个例子:
- 对于int类型的数据,他的数据必须是整数,整数上的操作有加减乘除等等。
- 比如char类型,他的数据是字符,字符上的操作就有大小写转换等等操作。
所以,什么是结构体呢???
1.1 结构体
结构体其实也是一个数据类型,但是这个数据类型是我们自己定义的,并且是将基础数据类型混合形成的复杂数据类型。
于是就产生了两个问题:
- 什么是基础数据类型:基础数据类型就是一些不可再分的数据类型,比如之前学到的int,char,float等等都是基础数据类型,他们都是不可再分的。(举一个简单的例子,数据中0~9这10个数就是基础数据,他们都是不可再分的数据类型)。
- 什么是复杂数据类型:复杂数据类型就好比是将基础数据类型进行组合,从而形成的一个新的数据类型,但是这个数据类型是可以细分的,细分之后你会发现他里边的元素就是基础数据类型。(比如,一个数字101就是一个复杂数据,他可以细分为1,0,1三个基础数据)。
一般定义的解释都是很枯燥的,所以我们来举一个例子吧。
1.1.1 基础数据类型
int a = 7;
char flag = 'A';
基础数据类型就是不可再分的数据类型,看上边的int,char两个数据类型是不是都不可再分了吖,所以他们都是基础数据类型。
其实在数据中只有两种数据类型:基础 和 复杂,我们之前所学的数据类型都是基础数据类型。
1.1.2 复杂数据类型
我们有一个学生的数据表,每一个学生作为一个独立的个体肯定都有着自己许多的信息,比如:姓名,性别,年龄,学号等等。
这个时候我们就在想,我们是不是可以自己定义一个数据类型,叫做Student呢?
答案是当然可以,就比如下边这样:
结构体的图示
- 于是我们就定义了一个新的数据类型,这个数据类型名字叫做Student,这个时候Student就和int类型差不多,都可以使用他来定义一个个的变量了。
结构体的使用
Student
- 使用
Student stu;
就定义出了一个Student类型的数据变量stu
。(就好像使用 int a就定义出了一个整形变量a是一样的道理。) - 对于Student类型的stu,我们可以怎么赋值呢?当然是按照定义数据类型Student时,使用的基础数据类型进行赋值了。(具体赋值原理先不讲,因为现在还没讲语法呢。)
1.2 结构体语法
1.2.1 结构体的定义
1.2.1.1 基础定义
上边说了,结构体的定义其实就是定义了一个新的数据类型,这个数据类型是使用基础数据类型组合形成的。所以语法如下:
语法:
struct Student{
这里放上这个结构体用到的基础数据类型
;};
- struct是结构体定义的语法。
- Student是这个结构体的名字。
例子:
int a = 7;
char flag = 'A';
- 定义了一个名字为Student的结构体。
- Student结构体里边有四个基础数据类型,是name、id、gender、age。分别对应的含义是姓名、学号、性别、年龄。
定义的完整代码:
#include <stdio.h>
struct Student{
char name[30];
int id;
int gender;
int age;
}; // 分号别少了
void main(){
}
- 需要注意的是,结构体是放在main函数外边的。
- 不要少了分号。
但是,经过上述的定义之后,要怎么使用呢?
其实最笨的使用方式就是要把结构体的完整定义都带上来用,如下所示:
#include <stdio.h>
struct Student{
char name[30];
int id;
int gender;
int age;
};
void main(){
struct Student stu = {"Zhang",1001,1,23};
}
- 要把完整的定义语法作为一个定义语句,比如:
struct Student stu
。
但是每次都带着struct是不是很麻烦啊。
1.2.1.2 起别名
这个时候就要引入一个思想,我们把自定义的数据类型(结构体)起一个别名好不好。
示例:
typedef struct Student{
char name[30];
int id;
int gender;
int age;
}Stu;
- 这里的typedef就是起别名的语法。
- 所以这里的意思就是,我们将结构体
struct Student{
char name[30];
int id;
int gender;
int age;
}
起了一个别名叫做 Stu,于是就可以直接使用Stu来定义变量了吖。
例子:
#include <stdio.h>
typedef struct Student{
char name[30];
int id;
int gender;
int age;
}Stu;
void main(){
Stu stu = {"Zhang",1001,1,23};
}
- 自定义了一个数据类型Student,并且给这个变量起了一个别名叫做Stu。
- 使用数据类型Stu定义出了一个变量stu存放的信息是一个学生的姓名、学号、性别、年龄信息。
- 于是在定义的时候直接可以进行赋值了。
1.2.2 结构体的使用
既然我们定义出的数据类型可以存放信息,那么我们当然也可以访问、修改这些信息。
要怎么操作结构体的数据呢?
1.2.2.1 结构体的操作原理
首先我们要明确一点,我们的真实数据是结构体变量中的属性值,所以操作的时候我们操作的应该是结构体变量中的属性的内容,而不是结构体变量。蒙B了吧,哈哈哈哈,看下边的解释吧。
- 首先,定义出了一个结构体变量stu1,(其实就是用自定义数据类型Stu定义出了一个Stu类型的数据变量而已。)
- 此时结构体变量stu1有4个属性,分别是name,id,gender,age。并且他们都被赋予了初始值。
- 此时stu1就相当于是一个用户的信息了,如果这个人年龄增加了,我们是不是应该将他的age进行修改吖。
- 这个时候,我们操作的应该是结构体变量stu1里边属性age的值,而不是结构体变量stu1。
1.2.2.2 结构体变量的使用
所以,有一个新的操作符号引入,就是单纯的一个 .
来操作属性。
例子:
stu1.age = 25;
- 这样就可以修改了。具体演示代码如下
代码:
#include <stdio.h>
#include <string.h>
typedef struct Student{
char name[30];
int id;
int gender;
int age;
}Stu;
void main(){
Stu stu1 = {"Zhang",1001,1,22};
printf("原始数据:\n");
printf("%s\n",stu1.name);
printf("%d\n",stu1.id);
printf("%d\n",stu1.gender);
printf("%d\n",stu1.age);
// 修改数据
strcpy(stu1.name,"Wang");
stu1.id = 1202;
stu1.gender = 0;
stu1.age = 55;
printf("修改之后的数据:\n");
printf("%s\n",stu1.name);
printf("%d\n",stu1.id);
printf("%d\n",stu1.gender);
printf("%d\n",stu1.age);
}
输出结果
解释:
- 刚才说过使用 “点” 就可以访问结构体变量中的属性值了,所以代码中的点大家应该知道是访问属性的意思了吧。
- 首先,使用自定义数据类型Stu定义了一个变量stu1并且顺便赋予了初始值。
- 然后,使用
变量名.属性名
得到属性的值,并且输出。 - 紧接着修改数据,其他的一些字段都还好,直接使用
变量名.属性名
得到属性名,然后重新赋值即可,但是这里需要注意name的修改需要使用字符串的拷贝函数。 - 因为本身name是一个char类型的数组,然而我们即将放入的值"Wang"是一个字符串,所以字符与字符串类型不匹配,因此直接通过字符串的拷贝函数,将"Wang"拷贝进入字符数组即可。
- 最后,还是同样的方式,使用
变量名.属性名
得到属性的值,并且输出。
2. 结束
下一节讲一些结构体的高级用法。