1. 结构体的声明
1.1:结构的基础知识
结构体是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。可以说结构体是一组不一定相同类型元素的集合
(数组:一组相同类型元素的集合)
生活中的描述:
人:名字 + 性别 + 年龄 + 身高 + 身份证号码 + 地址……
书:书名 + 作者 + 出版社 + 定价 + 书号……
这两者都是复杂对象,不能通过内置类型直接描述和表示
所以就有 结构体 来描述复杂类型
1.2:结构的声明
语法格式:
struct tag
{
member - list;
struct:定义结构体的关键字
tag:根据实际情况给结构体起名
member - list:成员变量列表(1个或者多个)
variable - list:变量列表
(注: 大括号{} 后面有个 分号;)
(演示代码:创建一个学生结构体)
//结构体 #include <stdio.h> //描述一个学生 //声明结构体类型,还没创建空间,所以成员变量没法初始化 struct Stu //struct:定义结构体的关键字 //tag:根据实际情况给结构体起名 { //member - list:成员变量列表(1个或者多个 //成员变量:用来描述结构体对象的相关属性的 char name[20]; int age; char sex[5]; //男 女 保密,一个汉字占2个字符 } s2, s3, s4; //variable - list:变量列表,也可以在这创建变量,在创建类型随便创建变量 //因为是在大括号外创建的变量,所以是全局变量,开创了内存空间 typedef struct Stu { char name[20]; int age; char sex[5]; } Stu; //使用 typedef 重新将 struct Stu 命名为 Stu int main() { //struct Stu 就是一个类型 struct Stu s1; //这里创建的是局部变量 //运用该结构体类型创建一个名为是 s1 的学生变量 //声明一个 学生变量 后才创建了空间 //在C语言中,没有使用 typedef 重命名的话,struct关键字 是不能省略的 Stu s2; //使用typedef 重新命名后,直接使用重命名的名称就可以 return 0; }
1.3 结构成员的类型
结构的成员可以是 标量(变量)、数组、指针。甚至是其他结构体
(演示代码:)
//结构成员的类型 #include <stdio.h> struct A { int a; //标量(变量) char arr[5]; //数组 int* p; //指针 }; struct B { char ch[10]; struct A a; //结构体 double d; }; int main() { return 0; }
1.4:结构体变量的定义和初始化
1. 结构体变量的 定义
//结构体变量的定义 #include <stdio.h> struct A { int a; //标量(变量) char arr[5]; //数组 int* p; //指针 }a1; //定义种定义方式,声明类型时就创建变量,此时为全局变量 struct A a2; //创建全局结构体变量 struct B { char ch[10]; struct A a; //结构体 double d; }; int main() { struct A a3; //在主函数中创建结构体变量 return 0; }
2. 结构体变量的 初始化
//结构体变量的访问 #include <stdio.h> struct A { int a; //标量(变量) char arr[5]; //数组 int* p; //指针 }a1 = {100, "lll", NULL}; //初始化方式和数组的类似 struct A a2 = {99, "hhh", NULL}; struct B { char ch[10]; struct A a; //结构体 double d; }; int main() { struct A a3 = {.arr = "abc", .p = NULL, .a = 1}; //通过 .操作符 访问成员变量,再进行初始化 printf("%d %s %p\n", a3.a, a3.arr, a3.p); //使用 .结构成员访问操作符 访问结构成员变量 struct B b1 = { "hello", {20, "qqq", NULL}, 3.14 }; printf("%s %d %s %p %lf\n", b1.ch, b1.a.a, b1.a.arr, b1.a.p, b1.d); return 0; }
2. 结构体成员的访问
相关操作符:
. 结构成员访问操作符:
用于结构体变量访问结构成员,点操作符接受两个操作数:结构变量名.结构成员名
. 结构成员访问操作符:
用于结构体变量访问结构成员,点操作符接受两个操作数:结构变量名.结构成员名
(错误示范:传值调用)
//访问 #include <stdio.h> #include <string.h> struct Stu { int age; char name[20]; }; //定义一个函数,对结构体成员进行赋值 void set_stu(struct Stu t)//t 的类型就是struct Stu { t.age = 20; //因为成员 name 是数组,数组名是首元素地址 //t.name = "张三"; //所以不能这样写,不能把 张三 放在地址上 //应该把 张三 放在地址的空间里 //strcpy()函数:字符串拷贝 strcpy(t.name, "张三"); //strcpy:把字符串拷贝到一个地方 //把 张三这个字符串 拷贝到 t.name这个空间去 } //定义一个函数,打印结构体变量 void print_stu(struct Stu t) { printf("%s %d\n", t.name, t.age); } int main() { struct Stu s = { 0 }; //定义一个函数,对结构体成员进行赋值 set_stu(s); //定义一个函数,打印结构体变量 print_stu(s); return 0; }