引入
前面,我们已经学习了三种声明结构体变量的方式,今天我们来学习如何给结构体变量赋初始值和输出该结构体成员的值。
例子
把一个学生信息放在一个结构体变量中,然后输出这个学生的信息。
#include <stdio.h>
int main(){
struct Student{
int num;
char name[20];
char sex;
int age;
char addr[50];
}student_1={001,"Bliner",'M',26,"China,Beijing"};
printf("No.%d\n姓名:%s\n性别:%c\n年龄%d\n家庭住址:%s\n",student_1.num,student_1.name,student_1.sex,student_1.age,student_1.addr);
return 0;
}
输出结果:
No.1
姓名:Bliner
性别:M
年龄26
家庭住址:China,Beijing
程序在一开始,声明了一个 Student 的结构体类型,有 5 个成员。然后再声明类型的同时,定义了一个结构体变量 student_1,它具有 Student 结构体中所规定的结构。
在变量名后面的花括号中,将个成员的值按结构体内顺序分别赋值给 student_1 中的各个成员。
初始化结构体
上面,我们在声明结构体的同时,初始化了变量 student_1 ,初始化列表是用花括号括起来的一些常量,这些常量依次赋值给结构体变量中的各成员。
(这是对结构体变量的初始化,不是结构体类型的初始化)
我们也可以只给结构体中的某一成员初始化:
struct Student student_1={.name="Bliner"};
//记得 name 前面有个点
上面就是对 student_1 这个结构体变量中的 name 成员进行初始化,切记成员名称前有一个点。
.name代表结构体变量中成员 student_1.name,其它没有指定初始化的数值成员会被系统初始化为0。
(指针为 NULL,字符为”\0”)
引用结构体变量
引用方式为:
结构体变量名 . 成员名
student_1.name; // 代表的就是 sutdent_1 变量中的 name 成员
因此,我们可以把 student_1.name 作为一个整体来看:
student_1.name="Bliner";
上面的语句是把 Bliner 字符串赋值给 student_1 结构体变量中的 name 成员。
其中 结构体变量名和成员名中间的点是成员运算符。它在所有运算符中优先级最高。
结构体中的结构体
如果结构体成员本身也是一个结构体,那需要一级一级的找到最低一级的成员。我们只能操作最低一级的成员,没办法直接操作结构体。
student_1.num; //这个表示student_1结构体变量中的 num 成员
student_1.birthday.month;
//这个表示sutdent_1中有一个成员 birthday 也是一个结构体,month 是 birthday 这个结构体中的一个成员。
如果成员也是结构体,我们必须找到该成员结构体的成员才能操作它。
结构体变量的运算
既然结构体变量中的成员可以单独赋值和使用,那么我们就可以像普通变量一样进行各种运算。
student_2.num=student_1.num; //赋值运算
sum=student_1.age+student_2.age; //加法运算
student_1.score++; //自加运算
同类的结构体变量可以相互赋值
如果两个结构体变量都属于同一结构体,那么两个结构体变量可以相互赋值。
student_1=student_2; //因为结构体相同,所以不同逐个成员进行赋值
结构体的地址
可以引用结构体成员的地址,也可以引用结构体的地址
sancf("%d",&student_1.age); //将输入值赋值给 student_1.age
prfintf("%o",student_1); //将 student_1 结构体的地址输出出来
综合使用
输入两个学生的信息,返回成绩最好的学生的信息。
#include <stdio.h>
int main(){
struct Student{
int num;
char name[20];
int score;
}s1,s2;
printf("请输入学生的个人信息:\n");
scanf("%d %s %d",&s1.num,s1.name,&s1.score);
scanf("%d %s %d",&s2.num,s2.name,&s2.score);
printf("输入的学生是:\n");
printf("%d号,%s,成绩是:%d\n",s1.num,s1.name,s1.score);
printf("%d号,%s,成绩是:%d\n",s2.num,s2.name,s2.score);
printf("成绩最好的是:\n");
if(s1.score>s2.score){
printf("%d号,%s,成绩是:%d\n",s1.num,s1.name,s1.score);
} else{
printf("%d号,%s,成绩是:%d\n",s2.num,s2.name,s2.score);
}
return 0;
}
注意
- s1和s2是结构体变量,里面存放学号、姓名和成绩。
- 再 scanf 赋值的时候,因为姓名是字符数组了,所以不用加&
- 结构体变量中的信息都绑定在一起,所以只比较成绩,就可以很方便的输出该成绩所对应的其它信息了。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。
评论