🌞欢迎来到C语言的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🌠本阶段属于锻体阶段,希望各位仙友顺利完成突破
📆首发时间:🌹2021年1月18日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
0️⃣✨✨✨结构体类型变量的定义和别名✨✨✨
在定义了一种结构体类型以后,就等于又产生了一种新的数据类型,可以用这种类型定义变量。定义结构体类型的变量有3种方式:
(1)先定义结构体类型再定义变量
例如,定义了结构体类型:
struct student { int num; //学号 char name[20]; //姓名 char addr[30]; //地址 };
完成这个结构体类型的定义后,就可以用“类型 变量名”的方式定义变量。例如,struct student stuA,stuB;,这就定义了两个变量stuA和stuB,它们都是struct student类型。
(2)在定义类型的同时定义变量
struct student { int num; char name[20]; char addr[30]; }stuA,stuB;
这样也定义了两个类型为struct student的变量stuA和stuB,这种方式定义完变量以后,以后还可以用第一种方式继续定义这种结构体类型的其它变量。
(3)直接定义结构体类型变量
前面讲定义一个结构体类型时说过,结构体类型的tag是可以没有的,这称为匿名结构体类型。要定义匿名结构体类型的变量,则只能在定义完一个结构体类型后立即定义变量,而且在后续代码中,不能再定义这种类型的变量。
struct { int num; char name[20]; char addr[30]; }stuA,stuB;
C中提供了一个关键字typedef,可以把结构体类型定义为一个别名,然后用这个别名去定义这种结构体类型的变量,而不用写成“struct结构体名 变量名”的形式。例如,
typedef struct student { long int num; char name[20]; char sex; char addr[20]; }Student;
关键字typedef把整个结构体类型struct student定义为一个别名Student,意思是struct student又叫做Student。有了这个别名,就可以用“别名 变量名”定义struct student类型的变量。例如,Student stu;就定义了一个名为stu的结构体类型变量,与struct student stu;的效果完全一样。
还可以用关键字typedef把同一种结构体类型指定为不同的数据类型别名,如指针形式的别名。例如,
typedef struct student { long int num; char name[20]; char sex; char addr[20]; }Student,*stuPtr;
这里,指定了两个别名,Student是struct student结构体类型的别名,stuPtr是指向struct student结构体类型的指针类型别名。
stuPtr sPtr;相当于Student *sPtr;或者struct student *sPtr;。
1️⃣✨✨✨ 结构体变量初始化和引用✨✨✨
在结构体类型定义后,有三种方法对结构体类型变量进行初始化。
(1)结构体类型定义完成后,立即定义变量并用{}的方式赋初值。
struct student { long int num; char name[20]; char sex; char addr[20]; } stu={202018080,"qingyun",'m',"xiaoxian"};
(2)定义完一个结构体类型以后,在其它地方定义这种类型的变量时,用{}的方式进行初始化。
struct student stu={202018080,"qingyun",'m',"xiaoxian"};
(3)可以指定成员变量名进行初始化。
struct student stu={.num=18, .name="qingyun"};
结构体类型变量的引用(常用)
引用结构体成员变量与引用基本数据类型变量有点不一样,为了访问结构体成员,要使用成员选择符(.),成员选择符是结构体变量名与要访问的结构成员之间的一个点号。例如,有定义struct student stu,要给结构体中的两个成员变量赋值,可以用下面两条语句实现。
stu.num=202018080; strcpy(stu.name, "qingyun");stu.num=202018080; strcpy(stu.name, "qingyun");
综合例子
给定一个结构体类型,定义两个这种结构体类型的变量stu1和stu2,对stu1进行初始化,然后把stu1的值赋给stu2,然后修改stu2的两个成员值,最后输出两个变量的所有成员值。
#include <stdio.h> typedef struct student { long int num; char name[20]; char sex; char addr[20]; }Student; int main(void) { /*定义两个变量结构体变量stu1和stu2,并初值化stu1 */ Student stu1={202018080,"qingyun",'m',"xiaoxian"},stu2; stu2=stu1; //把stu1的值赋给stu2,可赋所有成员变量的值。 stu2.num=202018081; //给stu2的num成员变量赋值。 strcpy(stu2.name, "wenchu"); //给stu2的name成员变量赋值。 /*下面是输出结构体的值,注意要指定到基本类型。*/ printf("no.:%hd name:%s sex:%c address:%s\n",stu1.num,stu1.name, \ stu1.sex, stu1.addr); printf("no.:%hd name:%s sex:%c address:%s\n",stu2.num,stu2.name, \ stu2.sex, stu2.addr); return 0; }
2️⃣✨✨✨结构体数组✨✨✨
typedef struct student { long int num; char name[20]; char sex; char addr[20]; }Student;
现在就可以用它来定义数组,如定义一个一维数组Student stu[5];。这个数组中有5个元素,每个元素都是Student类型。同样地,stu这个数组名的值是一个指针值,指向该数组的第0个元素(Student stu[5];等同于struct student stu[5];)。
与基本类型一维数组一样,可以用顺序下标初始器、受指定的初始化器以及两种的混合对结构体类型的数组进行初始化。例如,
Student stu[5]={{1,"zhang",'M',"Anhui"},{2,"wang",'M',"Henan"}}; Student stu[5]={[1]={1,"zhang",'M',"Anhui"},{2,"wang",'M',"Henan"}};
定义完数组后,要引用它的某个元素的成员变量,可使用“数组变量.成员变量”的方式进行。例如要访问数组第0个元素的num成员变量,就可以写成stu[0].num。
例利用结构体数组初始化stu1,stu2.
#include <stdio.h> typedef struct student { int num; char name[10]; char sex; char addr[10]; }Student; int main(void) { /*定义两个变量结构体变量stu1和stu2,并初值化stu1 */ Student stu[2]={{202018080,"qingyun",'m',"xiaoxian"}, \ {202018081,"wenzhu",'w',"xiaoxian"}}; printf("no.:%d name:%s sex:%c address:%s\n",stu[0].num,stu[0].name, \ stu[0].sex, stu[0].addr); printf("no.:%d name:%s sex:%c address:%s\n",stu[1].num,stu[1].name, \ stu[1].sex, stu[1].addr); return 0; }
3️⃣✨✨✨指向结构体类型的指针✨✨✨
Student *p;
这里的p是一个地址变量,在一般编译器中占4或8个字节的长度。p指向的空间存放的是Student类型的数据。
指向结构体类型的指针变量在引用结构体的成员变量时,是用“->”来引用,例如,p->num;表示引用p指向的结构体类型数据中的num成员变量。
#include <stdio.h> typedef struct student { long num; char name[20]; char sex; float score; }Student,*Ptr; int main(void) { Student stu={202018080,"qingyun",'m',97.5}; Ptr p; p=&stu; printf("no.:%ld,name:%s,sex:%c,score:%f\n",stu.num,stu.name,stu.sex,stu.score); printf("no.:%ld,name:%s,sex:%c,score:%f\n", (*p).num,(*p).name,(*p).sex,(*p).score); printf("no.:%ld,name:%s,sex:%c,score:%f\n", p->num,p->name,p->sex,p->score); return 0; }
4️⃣✨✨✨结构体类型数据作为函数参数✨✨✨
调用函数时,结构体类型的实参把它的所有成员变量的值复制给形参变量。
例10-5-1在main函数中,定义一个结构体变量,输入它的成员值,然后,定义一个函数把这个结构体类型变量的各成员值都输出出来。
#include <stdio.h> typedef struct student { long num; char name[10]; char sex; float score; }Student; void print(Student stu) //定义结构体类型的形参,接收实参变量值。 { printf("no.:%ld name:%s sex:%c score:%-5.1f\n", \ stu.num,stu.name,stu.sex,stu.score); } int main(void) { Student stu1={202018080,"qingyun",97.5}; print(stu1); return 0; }
#include <stdio.h> typedef struct student { long num; char name[20]; char sex; float score; }Student,*S; //定义了一个指针类型别名 void print(S p) //一个指向结构体类型的指针变量作为形参。 { printf("no.:%ld\nname:%s\nsex:%c\nscore:%f\n", \ p->num,p->name,p->sex,p->score); } int main(void) { Student stu_1={89101, "lilin",'m', 89.5}; print(&stu_1); //把变量stu_1的地址复制给形参p。 return 0; }