程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java、鸿蒙、嵌入式、人工智能等开发,专注于程序员成长的那点儿事,希望在成长的路上有你相伴!君志所向,一往无前!
为什么需要结构体?
C 语言内置的数据类型,除了几种原始的基本数据类型,只有数组属于复合类型,可以同时包含多个值,但是只能包含相同类型
的数据,实际使用场景受限。
举例:
现有一个需求,编写学生档案管理系统,这里需要描述一个学生的信息。该学生的信息包括学号、姓名、性别、年龄、家庭住址等,这些数据共同说明一个学生的总体情况。
这些数据类型各不相同,无法使用数组进行统一管理。
传统的解决方法
尝试1
:单独定义多个变量存储,实现需求。但是,多个变量,不便于数据的管理。
尝试2
:使用数组,它是一组具有相同类型的数据的集合。但在编程中,往往还需要一组类型不同的数据,例如猫的名字使用字符串、年龄是int,颜色是字符串,因为数据类型不同,不能用一个数组来存放。
尝试3
:C语言提供了结构体。使用结构体,内部可以定义多个不同类型的变量作为其成员。
什么是结构体
C 语言提供了 struct
关键字,允许自定义复合数据类型,将不同类型的值组合在一起,这种类型称为结构体(structure)类型。
C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。
其实大家在HarmonyOS开发中,是不是也经常使用struct关键字?
结构体的声明
构建一个结构体类型的一般格式:
struct 结构体名{
数据类型1 成员名1; //分号结尾
数据类型2 成员名2;
……
数据类型n 成员名n;
}; //注意最后有一个分号
比如定义一个学员:
struct Student{ // 定义结构体:学生
int id; //学号
char name[20]; //姓名
char gender; //性别
char address[50]; //家庭住址
};
结构体变量和调用
定义了新的数据类型以后,就可以声明该类型的变量,这与声明其他类型变量的写法是一样的。
声明结构体变量格式1:
struct 结构体类型名称 结构体变量名;
注意,声明自定义类型的变量时,类型名前面,不要忘记加上 struct 关键字。
举例:
struct Student stu1;
调用结构体变量的成员:
结构体变量名.成员名 [= 常量或变量值]
举例:
#include <stdio.h>
#include <string.h>
int main() {
struct Student stu1; //声明结构体变量
//调用结构体成员
stu1.id = 1001;
//stu1.name = "Tom"; //报错,不能直接通过赋值运算符来给字符数组赋值
strcpy(stu1.name, "Tony");
stu1.gender = 'M';
strcpy(stu1.address, "北京市海淀区五道口");
printf("id = %d,name = %s,gender = %c,address = %s\n",
stu1.id, stu1.name, stu1.gender, stu1.address);
return 0;
}
说明:
1)先声明了一个 struct Student类型的变量 stu1,这时编译器就会为 stu1 分配内存,接着就可以为 stu1 的不同属性赋值。可以看到,struct 结构的属性通过点( . )来表示,比如 id 属性要写成 stu1.id。
2)字符数组是一种特殊的数组,直接改掉字符数组名的地址会报错,因此不能直接通过赋值运算符来对它进行赋值。你可以使用字符串库函数
strcpy()
来进行字符串的复制操作。
声明结构体变量格式2:
除了逐一对属性赋值,也可以使用大括号,一次性对 struct 结构的所有属性赋值。
此时,初始化的属性个数最好与结构体中成员个数相同,且成员的先后顺序一一对应。格式:
struct 结构体名 结构体变量={初始化数据};
声明结构体变量格式3:
方式2中大括号里面的值的顺序,必须与 struct 类型声明时属性的顺序一致。
此时,可以为每个值指定属性名。
格式:
struct 结构体名 结构体变量={.成员1=xxx,.成员2=yyy,...};
声明结构体变量格式4: 声明类型的同时定义变量
struct 的数据类型声明语句与变量的声明语句,可以合并为一个语句。格式:
struct 结构体名 {
成员列表
} 变量名列表;
声明结构体变量格式5: 不指定类型名而直接定义结构体类型变量
如果类型标识符(比如Student、Circle、Employee等)只用在声明时这一个地方,后面不再用到,那就可以将类型名省略。 该结构体称为匿名结构体
。
格式:
struct {
成员列表;
} 变量名列表;
声明结构体变量格式6: 使用 typedef 命令
使用 typedef 可以为 struct 结构指定一个别名,这样使用起来更简洁。
区分
区分三个概念:结构体、结构体变量、结构体变量的成员。
-
结构体是自定义的数据类型,表示的是一种数据类型。
-
结构体变量代表一个具体变量。类比:
int num1 ; // int 是数据类型, 而num1是一个具体的int变量 struct Car car1; // Car 是结构体数据类型,而car1是一个Car变量
-
Car 就像一个“汽车图纸”,生成出来的具体的一辆辆汽车,就类似于一个个的结构体变量。这些结构体变量都含有相同的成员,将结构体变量的成员比作“零件”,同一张图纸生产出来的零件的作用都是一样的。
好啦,就到这里吧,今天最后一天班,就正式放假啦,提前祝大家,新年快乐哈,今年不断更!关注我!