结构体
结构体是一种构造数据类型,把不同类型的数据组合成一个整体
结构体的定义形式:
struct 结构体名{
结构体所包含的变量或数组
struct student {
char name[]; //姓名
int num; //学号
int age; //年龄
};
**注意:**大括号后面的分号;不能少,这是一条完整的语句。
student 为结构体名,它包含了 53个成员,分别是 name、num、ag。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化。
结构体变量的初始化
#include <stdlib.h>
#include <stdio.h>
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books book = { "C 语言编程基础", "LOVE", "编程语言", 123456789 };
printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
system("pause");
return 0;
}
运行结果:
结构体成员访问
为了访问结构的成员,我们使用成员访问运算符(.)。
引用形式:<结构体类型变量名>.<成员名>
注意:结构体变量不能整体引用,只能引用变量成员
成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。可以使用 struct 关键字来定义结构类型的变量。
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
//在c 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,
//所以按照 c 语言规范是没有办法遍历枚举类型的
//枚举
enum Sex {
MALE,
FEMALE,
};
//结构体的成员
struct student {
char name[10];
int age;
int score;
enum Sex sex;
};
int main(){
//结构体是一个类型,要借助变量来实现
//struct sturct 是一个整体,构成了自定制的一种类型
//s的类型就叫做struct student
//结构体变量的定义和初始化
struct student s = { "zhangsan", 20, 45, FEMALE };
//成员结构体的访问. (.)代表成员访问符
printf("name=%s age=%d score=%d sex=%d\n",s.name,s.age,s.score,s.sex);
system("pause");
return 0 ;
}
运行结果:
利用typedef 和#define 对struct Student 进行重新命名
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//枚举
enum Sex {
MALE,
FEMALE,
};
//结构体的声明,成员结构访问
struct Student {
char name[20];
int age;
int score;
enum Sex sex;
};
//借助 typedef 函数对struct Student 重新命名 新名字叫做student
//typedef struct Student student;
#define student struct Student
int main(){
//结构体变量的定义和初始化
student s = { "zhangsan", 19, 95, MALE };
//成员结构体的访问. (.)代表成员访问符
将中文名字打印出来
//strcpy(s.name, "李四");
printf("name=%s age= %d score=%d sex=%d \n", s.name, s.age, s.score, s.sex);
system("pause");
return 0;
}
运行结果:
strcpy: 把一个字符串复制一份,复制到另一个数组中
结构体传参
结构体传参的结论:结构体传参的时候,要传结构体的地址
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//枚举
enum Sex {
MALE,
FEMALE,
};
//结构体的声明,成员结构访问
struct Student {
char name[20];
int age;
int score;
enum Sex sex;
};
//struct Student* 变量类型
void print(struct Student* ps){
printf("name=%s \n", (*ps).name);
}
int main(){
//结构体变量的定义和初始化
struct Student s = { "zhangsan", 19, 95, MALE };
//调用函数
print(&s);
system("pause");
return 0;
}
运行结果:
结构体数组
结构体数组所谓结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、工厂职工的数据统计情况等。
定义结构体数组和定义结构体变量的方式类似:
学生成绩的排名统计
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
//学生的姓名 学号 成绩
char name[10];
int num;// 学号
int score;
};
void Input(struct Student s[], int n) {
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的信息: \n", i + 1);
scanf("%s %d %d", s[i].name, &s[i].num, &s[i].score);
}
}
//注意:在交换数据时,我在第一次打代码时遇到了一个很常见的问题。就是在通过成绩比较时,只交换了成绩而其余信息并未被交换,导致数据错乱。所以在交换时应交换整个结构体数组,而不是只交换数组中的某一项。
void BubbleSort(struct Student s[],int n) {
for (int j = 0; j < n - 1; j++) {
for (int k = 0; k < n - j - 1; k++) {
if (s[k].score < s[k + 1].score) {
struct Student temp = s[k + 1];
s[k + 1] = s[k];
s[k] = temp;
}
}
}
}
void Print(struct Student s[], int n) {
printf("学生成绩从高到低排名如下: \n");
for (int i = 0; i < n; i++) {
printf("排名第%d学生的名字是:%s 学号: %d 成绩:%d \n", i + 1, s[i].name, s[i].num, s[i].score);
}
}
int main() {
struct Student s[10] ;//结构体初始化
int n=0;//学生个数
printf("*********************\n");
printf("* * * * * *\n");
printf("* * * * * *\n");
printf("* * * *\n");
printf("* 学生成绩排名系统 *\n");
printf("* * * *\n");
printf("* * * * * *\n");
printf("* * * * * *\n");
printf("*********************\n");
printf("请输入录入学生的总数: ");
scanf("%d",&n); //
printf("请输入学生的姓名 学号 成绩: \n");
Input(s,n);
BubbleSort(s, n);
Print(s,n);
system("pause");
return 0;
}
总结:
在交换数据时,我在第一次打代码时遇到了一个很常见的问题。就是在通过成绩比较时,只交换了成绩而其余信息并未被交换,导致数据错乱。所以在交换时应交换整个结构体数组,而不是只交换数组中的某一项。
关于结构体互换的几种方式
方式1:互换地址
//创建结构体
struct Student
{
char cName[20];
int number;
char csex;
}student1, student2;
struct Student student1 = { "Wang", 12345, 'W' }; //初始化
struct Student student2 = { "Zhao", 54321, 'M' };
struct Student*stu1 = &student1;
struct Student*stu2 = &student2;
struct Student *student3;
student3 = stu1;
stu1 = stu2;
stu2 = student3;
方式2:对于同类型结构体直接互换值就行
struct Student student3;
student3 = student1;
student1 = student2;
student2 = student3;
方式3:用memcpy()函数进行互换
方式4:利用for循环
结构体清空
1.依次对结构体的每一个成员进行清空
一般情况下,清空s的方法:
s.name[0] = ‘\0’;
s.num = 0;
s.score = 0;
2.借助memset
memset(&s, 0, sizeof(struct Student));
如果是数组:struct Student s[10];就是 memset(s, 0, sizeof(struct Student) * 10);