C语言之结构体
结构体
为什么需要结构体
为了表示一些复杂的事物,而普通的基本类型无法满足实际要求
什么叫结构体
把一些基本类型数据组合在一起形成的一个新的数据类型,这叫做结构体
如何定义结构体
3种方式,推荐第一种
# include <stdio.h> //第一种方式 struct Student { int age; float score; char sex; }; //第二种方式 struct Student2 { int age; float score; char sex; }st2; //第三种方式 struct { int age; float score; char sex; }st3; int main(void) { /* int age; float score; char name[100]; */ struct Student st = {80,78.5,'F'}; return 0; }
怎么使用结构体变量
赋值和初始化
定义的同时可以整体赋初值
如果定义完之后,则只能单个的赋初值
# include <stdio.h> struct Student { int age; float score; char sex; }; int main(void) { struct Student st = { 80,66.6,'F' }; //初始化 定义同时赋初值 struct Student st2; st2.age = 10; st2.score = 88.5; st2.sex = 'F'; printf("%d %f %c\n", st.age, st.score, st.sex); printf("%d %f %c\n", st2.age, st2.score, st2.sex); return 0; }
如何取出结构体变量中的每一个成员
1.结构体变量名.成员名
2.指针变量名->成员名
指针变量名->成员名 在计算机内部会被转换成(*指针变量名).成员名的方式来执行
所以说这两种方式是等价的
# include <stdio.h> struct Student { int age; float score; char sex; }; int main(void) { struct Student st = { 80,66.6,'F' }; struct Student* pst=&st; //&st不能改成st st.score = 65.5f; //第一种方式 pst->age = 88; //第二种方式 printf("%d %f\n", st.age, pst->score); return 0; //pst->age 在计算机内部会被转换成(*pst).age,这就是->的含义 }
1.pst->age 在计算机内部会被转换成(*pst).age,这就是->的含义,这也是一种硬性规定
2.所以pst->age等价于(*pst).age 也等价与 st.age
3.我们之所以知道pst->age等价于st.age,是因为pst->age是被转换成了(*pst).age来执行
4.pst->age的含义:pst所指向的那个结构体变量中的age这个成员
结构体变量的运算
结构体变量不能相加,不能相减,也不能相互乘除
但结构体变量可以相互复制
例子
struct Student
{
int age;
char sex;
char name[100];
};
struct Student st1,st2;
st1+st2; st1-st2; st1*st2; st1/st2; 都是错误的
st1=st2; st2=st1; 都是正确的
结构体变量和结构体变量指针作为函数参数传递的问题
推荐使用结构体指针变量作为函数参数来传递
# include <stdio.h> # include <string.h> void InputStudent(struct Student*); void OutputStudent(struct Student); struct Student { int age; char sex; char name[100]; }; int main(void) { struct Student st; InputStudent(&st); //对结构体变量输入 必须发送st的地址 OutputStudent(st); //对结构体变量输出 可以发送st的地址也可以直接发送st的内容 return 0; } void InputStudent(struct Student *pstu) //pstu只占4个字节 { (*pstu).age = 10; strcpy_s(pstu->name,"张三"); //不能写成stu.name="张三"; pstu->sex = 'F'; } void OutputStudent(struct Student st) { printf("%d %c %s\n", st.age, st.sex, st.name); } /* //本函数不能修改主函数的值 void InputStudent(struct Student stu) { stu.age = 10; strcpy(stu.name,"张三"); //不能写成stu.name="张三"; stu.sex = 'F'; } */
冒泡排序
#include <stdio.h> void sort(int * pArr,int len) { for (int i = 0;i < len-1;i++) { for (int j = 0;j < len - 1-i;j++) { int temp = 0; if (*(pArr + j) > *(pArr + j + 1)) { temp = *(pArr + j); *(pArr + j) = *(pArr + j + 1); *(pArr + j + 1) = temp; } } } } int main(void) { int a[6] = { 10,2,8,-8,11,0 }; int i = 0; sort(a,6); for (i = 0;i < 6;i++) { printf("%d\t", a[i]); } printf("\n"); return 0; }
举例:动态构造存放学生信息的结构体数组
动态构造一个数组,存放学生的信息
然后按分数排序输出
1 #define _CRT_SECURE_NO_WARNINGS 1 2 # include <stdio.h> 3 # include <malloc.h> 4 5 6 7 struct Student 8 { 9 int age; 10 float score; 11 char name[100]; 12 }; 13 14 void InputStudent(struct Student *,int len); 15 void OutputStudent(struct Student *, int len); 16 void sort(struct Student*,int len); 17 18 int main(void) 19 { 20 int len; 21 22 struct Student * pArr; 23 24 printf("请输入学生的个数:\n"); 25 printf("len="); 26 scanf("%d", &len); 27 28 //动态构造一维数组 29 pArr = (struct Student*)malloc(len * sizeof(struct Student)); 30 31 //输入学生信息 32 InputStudent(pArr, len); 33 34 printf("\n\n学生的信息是:\n\n"); 35 //输出学生信息 36 OutputStudent(pArr, len); 37 //成绩排序 38 printf("\n\n学生的成绩排序结果是:\n\n"); 39 sort(pArr, len); 40 41 return 0; 42 } 43 44 void InputStudent(struct Student* pstu,int len) 45 { 46 for (int i = 0;i < len;i++) 47 { 48 printf("请输入第%d个学生的信息\n", i + 1); 49 printf("age = "); 50 scanf("%d", &pstu[i].age); 51 printf("name = "); 52 scanf("%s", pstu[i].name); // name是数组名,本身就已经是数组首元素的地址,所以pArr[i].name不能写成&pArr[i].name 53 printf("score= "); 54 scanf("%f", &pstu[i].score); 55 } 56 } 57 58 void OutputStudent(struct Student* pstu, int len) 59 { 60 for (int i = 0;i < len;i++) 61 { 62 printf("第%d个学生的信息\n", i + 1); 63 printf("age = %d\t", pstu[i].age); 64 printf("name = %s\t", pstu[i].name); 65 printf("score = %f\t", pstu[i].score); 66 printf("\n"); 67 } 68 } 69 70 void sort(struct Student* pstu, int len) 71 { 72 for (int i = 0;i < len - 1;i++) 73 { 74 for (int j = 0;j < len - 1 - i;j++) 75 { 76 float temp = 0; 77 if (pstu[j].score > pstu[j + 1].score) 78 { 79 temp = pstu[j].score; 80 pstu[j].score = pstu[j + 1].score; 81 pstu[j + 1].score = temp; 82 } 83 } 84 } 85 86 //成绩排序结果 87 for (int i = 0;i < len;i++) 88 { 89 printf("%f\t", pstu[i].score); 90 } 91 }