结构体类型
- 用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体。
声明一个结构体类型的一般形式为:
struct
结构体名
{成员列表};
说明:
- 1.可以设计出许多种结构体类型
例如:
struct Teacher
struct Worker
struct Date
等结构体类型,各自包含不同的成员
- 2.成员可以属于另一个结构体类型
- 例如:
struct Date
{ int month; int day; int year; };
struct Student{
int num;
char name[20];
char sex;
int age;
struct Date birthday;
};
结构体类型变量
1.先声明结构体类型,再定义该类型变量。
- 例如:
// 声明结构体类型
struct Student{
int num;
char name[20];
char sex;
int age;
};
// 定义该类型变量
// 结构体类型名 结构体变量名
struct Student student1,student2;
2.在声明类型的同时定义变量
- 例如:
struct Student{
int num;
char name[20];
char sex;
int age;
}student1,student2;
3.不指定类型名而直接定义结构体类型变量
- 一般形式为:
struct
{成员表列}变量名表列;
指定了一个无名的结构体类型。
- 例如:
struct
{
int num;
char name[20];
char sex;
int age;
}student1,student2;
说明:
1.结构体类型与结构体变量是不同的概念,不要混同。
- 只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。
- 在编译时,对类型是不分配空间的,只对变量分配空间。
内存分配给结构体变量的存储空间是各成员变量所占存储空间的总和。
- 2.结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。
3.结构体变量可以在定义时进行初始化赋值。给结构体变量初始化时,所赋初值按顺序放在一对花括号中。
- 例如:
struct Student{
int num;
char name[20];
char sex;
int age;
}student1={2022160123,"Zhang san","男",24},student2;
结构体变量的成员的引用
结构体变量是构造类型变量,可访问操作的对象有两个。
- 1.结构体变量的成员;
- 2.结构体变量本身,代表组成该变量的所有数据成员。
引用结构体变量的成员
- 结构体变量成员的访问形式:
结构体变量名
.
成员名
- 例如:
student1.name
- 点号 “.” 称为成员运算符,是二目运算符,优先级是第一级,结合性是从左到右。
结构体变量的成员可以和普通变量一样参加各种运算
- 例如:
student2.num = student1.num++;
说明:
1.如果成员本身又是一个结构体类型,则要若干个成员运算符,逐级找到最低级的成员才能使用。
- 例如:
student2.birthday.day =18;
2.可以引用结构体变量成员的地址,此时 “&” 要放在结构体变量名前面。
- 例如:
scanf( "%d" ,&student2.num);
3.“&” 和 “.” 同时出现时,运算符“.”的优先级高
- 例如:
- 表达式
student1.num++
等价于(student1.num)++
。
4.相同结构体类型的结构体变量可以直接相互赋值。
- 例如:
- 将变量student1的所有成员值一一对应赋值给变量student2的所有成员值
student2 = student1;
- 5.结构体变量与基本类型变量不同,不要直接用来进行算术、关系和逻辑等运算,只能将成员逐个进行比较。
- 6.不能对结构体变量进行整体的输入/输出,只能对每个成员逐个输入或输出。
- 7.结构体变量占据的一片连续内存单元的首地址称为该结构体变量的地址,
每个成员占据的若干内存单元的首地址称为成员的地址,两个地址均可引用。
例子
把一个学生的信息(包括学号、姓名、性别、年龄)放在一个结构体变量中,然后输出这个学生的信息。
#include <stdio.h>
void main() {
struct Student {
long int num;
char name[20];
char sex;
int age;
}std = { 10001,"Zhang san",'M',20 };
printf("学号:NO.%ld\n姓名:%s\n性别:%c\n年龄:%d\n",
std.num,std.name,std.sex,std.age);
}
输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩
#include <stdio.h>
void main() {
struct Student {
long int num;
char name[20];
float score;
}std1,std2;
printf("请输入学生信息:\n");
// 对于数组输入,scanf_s要定义缓冲区大小,而且name前边不加&,name本身就是地址
scanf_s("%d%s%f", &std1.num, std1.name,21, &std1.score);
scanf_s("%d%s%f", &std2.num, std2.name,21, &std2.score);
if (std1.score > std2.score) {
printf("学号:NO.%ld\n姓名:%s\n成绩:%.2f\n",
std1.num, std1.name, std1.score);
}
else if (std1.score < std2.score) {
printf("学号:NO.%ld\n姓名:%s\n成绩:%.2f\n",
std2.num, std2.name, std2.score);
}
else {
printf("学号:NO.%ld\n姓名:%s\n成绩:%.2f\n",
std1.num, std1.name, std1.score);
printf("学号:NO.%ld\n姓名:%s\n成绩:%.2f\n",
std2.num, std2.name, std2.score);
}
}
评论