结构体
为什么需要结构体
为了表示一些复杂的事物,而普通的的基本
类型无法满足实际要求
什么叫结构体
把一些基本数据类型组合在一起形成的一个
新的复合数据类型,这个叫做结构体
如何定义结构体
三种方式,推荐使用第一种
1 /* 2 2015年04月26日 14:21:45 3 目的: 4 结构体的定义 5 */ 6 7 # include <stdio.h> 8 9 //第一种方式 10 struct Student1 11 { 12 int age; 13 float score; 14 char sex; 15 }; //分号不能省 16 17 //第二种方式 18 struct Student2 19 { 20 int age; 21 float score; 22 char sex; 23 }st2; 24 25 //第三种方式 26 struct 27 { 28 int age; 29 float score; 30 char sex; 31 }st3; 32 33 int main(void) 34 { 35 36 return 0; 37 } 38 39 /* 40 在VC6.0中运行结果是: 41 ----------------------------- 42 43 ----------------------------- 44 总结: 45 46 47 */
怎么使用结构体变量
赋值和初始化
1 /* 2 2015年04月26日 14:36:03 3 目的: 4 结构体的赋值和初始化 5 */ 6 7 # include <stdio.h> 8 9 struct Student 10 { 11 int age; 12 float score; 13 char sex; 14 }; 15 16 int main(void) 17 { 18 struct Student st1 = {80, 66.6, ‘F‘}; //定义的同时初始化 19 struct Student st2; //先定义后初始化 20 st2.age = 10; 21 st2.score = 88; 22 st2.sex = ‘F‘; 23 24 printf("%d %f %c\n", st1.age, st1.score, st1.sex); 25 printf("%d %f %c\n", st2.age, st2.score, st2.sex); 26 27 return 0; 28 } 29 30 /* 31 在VC6.0中运行结果是: 32 ----------------------------- 33 80 66.599998 F 34 10 88.000000 F 35 ----------------------------- 36 总结: 37 38 39 */
如何操作结构体变量中的成员
1. 结构体变量名.成员名
2. 指针变量名->成员名
1 /* 2 2015年04月26日 14:51:39 3 目的: 4 如何操作结构体变量中的成员 5 */ 6 7 # include <stdio.h> 8 9 struct Student 10 { 11 int age; 12 float score; 13 char sex; 14 }; 15 16 int main(void) 17 { 18 struct Student st = {80, 66.6F, ‘F‘}; 19 struct Student * pst = &st; 20 21 st.age = 22; //结构体变量名.成员名 22 pst->score = 99.9F; 23 /*指针变量名->成员名,这种格式较为常用 24 pst->age 在计算机内部会被转换成 (*pst).age 也等价于 st.age 25 99.9在C语言中默认是double类型,如果希望一个实数是float类型 26 必须在末尾加f或F,故99.9是double,99.9f或99.9F是float 27 */ 28 29 printf("%d\n%f\n", st.age, pst->score); 30 31 return 0; 32 } 33 34 /* 35 在VC6.0中运行结果是: 36 ----------------------------- 37 22 38 99.900002 39 ----------------------------- 40 总结: 41 42 43 */
结构体变量和结构体变量指针作为函数参数传递的问题
1 /* 2 2015年04月26日 16:02:47 3 目的: 4 结构体变量和结构体变量指针作为函数参数传递 5 */ 6 7 # include <stdio.h> 8 # include <string.h> 9 void InputStudent(struct Student *); 10 void OutputStudent(struct Student *); 11 12 struct Student 13 { 14 int age; 15 char sex; 16 }; //分号不能省 17 18 int main(void) 19 { 20 struct Student st; 21 22 InputStudent(&st); //对结构体变量输入,必须发送st的地址 23 //OutputStudent(st); //对结构体变量输出,可以直接发送st的内容 24 OutputStudent(&st); //也可以发送st的地址 25 return 0; 26 } 27 28 void InputStudent(struct Student * pStu) //pStu只占4个字节 29 { 30 (*pStu).age = 10; 31 pStu->sex = ‘F‘; 32 } 33 34 void OutputStudent(struct Student *pSt) 35 { 36 printf("%d %c \n", pSt->age, pSt->sex); 37 } 38 39 /* 40 void OutputStudent(struct Student ss) 41 { 42 printf("%d %c \n", ss.age, ss.sex); 43 } 44 */ 45 46 47 48 /* 49 在VC6.0中运行结果是: 50 ----------------------------- 51 10 F 52 ----------------------------- 53 总结:涉及到对内容的更改,必须发送地址 54 如果只是访问,可以发送内容也可以发送地址 55 推荐发送地址,因为 56 指针的优点: 57 快速的传递数据 58 耗用内存小 59 执行速度快 60 61 62 63 */
结构体变量的运算
结构体变量不能相加、减、乘和除
但可以相互赋值
例如:
st1 = st2;
冒泡排序:
1 /* 2 2015年04月26日 16:30:30 3 目的: 4 冒泡排序 5 */ 6 7 # include <stdio.h> 8 9 //冒泡排序 10 void sort(int * a, int len) 11 { 12 int i, j, t; 13 14 for (i=0; i<len-1; ++i) 15 { 16 for (j=0; j<len-1-i; ++j) 17 { 18 if (a[j] > a[j+1]) // >升序,<降序 19 { 20 t = a[j]; 21 a[j] = a[j+1]; 22 a[j+1] = t; 23 } 24 } 25 } 26 } 27 28 int main(void) 29 { 30 int a[6] = {10, 2, 8, -8, 11, 0}; 31 int i; 32 33 sort(a, 6); 34 35 for (i=0; i<6; ++i) 36 { 37 printf("%d ", a[i]); 38 } 39 40 printf("\n"); 41 42 return 0; 43 } 44 45 /* 46 在VC6.0中运行结果是: 47 ----------------------------- 48 -8 0 2 8 10 11 49 ----------------------------- 50 总结: 51 52 */
举例
动态构造存放学生信息的结构体数组
1 /* 2 2015年04月26日 17:20:47 3 目的: 4 学生管理系统 5 动态构造一个数组,存放学生的信息 6 然后按分数排序输出(降序) 7 */ 8 9 # include <stdio.h> 10 # include <malloc.h> 11 12 struct Student 13 { 14 int age; 15 float score; 16 char name[100]; 17 }; 18 19 int main(void) 20 { 21 int len; 22 struct Student * pArr; 23 int i, j; 24 struct Student t; 25 26 printf("请输入学生个数:\n"); 27 printf("len = "); 28 scanf("%d", &len); 29 30 //动态构造一维数组 31 pArr = (struct Student *)malloc(len * sizeof(struct Student)); 32 33 for (i=0; i<len; ++i) 34 { 35 printf("请输入第%d个学生的信息:\n", i+1); 36 printf("age = "); 37 scanf("%d", &pArr[i].age); 38 39 printf("name = "); 40 scanf("%s", pArr[i].name); //name是数组名,即首元素地址。不能再加& 41 42 printf("score = "); 43 scanf("%f", &pArr[i].score); 44 45 } 46 47 //按学生成绩降序排序 冒泡算法 48 for (i=0; i<len-1; ++i) 49 { 50 for (j = 0; j<len-1-i; ++j) 51 { 52 if (pArr[j].score < pArr[j+1].score) 53 { 54 t = pArr[j]; //此处不能写成pArr[j].score,因为是整个一个学生信息互换,而不是只交换分数 55 pArr[j] = pArr[j+1]; 56 pArr[j+1] = t; 57 } 58 } 59 60 } 61 62 63 printf("\n\n\n\n"); 64 65 //输出 66 for (i=0; i<len; ++i) 67 { 68 printf("第%d个学生的信息是:\n", i+1); 69 printf("age = %d\n", pArr[i].age); 70 printf("name = %s\n", pArr[i].name); 71 printf("score = %f\n", pArr[i].score); 72 73 printf("\n"); 74 75 } 76 77 78 return 0; 79 } 80 81 /* 82 在VC6.0中运行结果是: 83 ----------------------------- 84 请输入学生个数: 85 len = 3 86 请输入第1个学生的信息: 87 age = 22 88 name = zhangsan 89 score = 67 90 请输入第2个学生的信息: 91 age = 23 92 name = lisi 93 score = 77 94 请输入第3个学生的信息: 95 age = 34 96 name = wangwu 97 score = 56 98 99 100 101 102 第1个学生的信息是: 103 age = 23 104 name = lisi 105 score = 77.000000 106 107 第2个学生的信息是: 108 age = 22 109 name = zhangsan 110 score = 67.000000 111 112 第3个学生的信息是: 113 age = 34 114 name = wangwu 115 score = 56.000000 116 ----------------------------- 117 总结: 118 119 */
时间: 2024-10-13 00:13:43