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呢?

答案是当然可以,就比如下边这样:

结构体的图示

C语言零基础入门-结构体-01_基础数据类型

C语言零基础入门-结构体-01_数据_02

  • 于是我们就定义了一个新的数据类型,这个数据类型名字叫做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了吧,哈哈哈哈,看下边的解释吧。

C语言零基础入门-结构体-01_基础数据类型

C语言零基础入门-结构体-01_数据类型_04

  • 首先,定义出了一个结构体变量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);
}


输出结果

C语言零基础入门-结构体-01_基础数据类型

C语言零基础入门-结构体-01_基础数据类型_06

解释:

  • 刚才说过使用 “点” 就可以访问结构体变量中的属性值了,所以代码中的点大家应该知道是访问属性的意思了吧。
  • 首先,使用自定义数据类型Stu定义了一个变量stu1并且顺便赋予了初始值。
  • 然后,使用 ​变量名.属性名 得到属性的值,并且输出。
  • 紧接着修改数据,其他的一些字段都还好,直接使用 ​变量名.属性名 得到属性名,然后重新赋值即可,但是这里需要注意name的修改需要使用字符串的拷贝函数。
  • 因为本身name是一个char类型的数组,然而我们即将放入的值"Wang"是一个字符串,所以字符与字符串类型不匹配,因此直接通过字符串的拷贝函数,将"Wang"拷贝进入字符数组即可。
  • 最后,还是同样的方式,使用 ​变量名.属性名 得到属性的值,并且输出。

2. 结束

下一节讲一些结构体的高级用法。


C语言零基础入门-结构体-01_数据_07