结构体变量可以作为函数的形参和返回值使用(不要这么做,因为结构体变量中可能包含非常多的东西,在调用过程中很花时间)
使用结构体变量作为形参或返回值会浪费时间和空间,所以应该使用结构体指针作为形参和返回值例子: 1 #include <stdio.h> 2 3 typedef struct screen { 4 int x; 5 int y; 6 } screen; 7 8 screen *midpt(const screen *s_a1, const screen *s_a2, screen *s_a3) { 9 s_a3->x = (s_a1->x + s_a2->x) / 2; 10 s_a3->y = (s_a1->y + s_a2->y) / 2; 11 return s_a3; 12 } 13 int main() { 14 screen a1 = {}, a2 = {}, a3 = {}; 15 printf("请输入第一个点的位置:"); 16 scanf("%d%d", &a1.x, &a1.y); 17 printf("请输入第二个点的位置:"); 18 scanf("%d%d", &a2.x, &a2.y); 19 midpt(&a1, &a2, &a3); 20 printf("中点的位置为:%d %d\n", a3.x, a3.y); 21 return 0; 22 } 练习:求矩形面积 1 #include <stdio.h> 2 3 typedef struct pt { 4 int x, y; 5 } pt; 6 7 typedef struct rect { 8 pt p1, p2; 9 } rect; 10 11 int get(const rect *r_r) { 12 int ret = 0; 13 ret = (r_r->p1.x - r_r->p2.x) * (r_r->p2.y - r_r->p1.y); 14 ret = ret > 0 ? ret : 0 - ret; 15 return ret; 16 } 17 int main() { 18 rect r = {}; 19 int ret = 0; 20 printf("请输入第一个点的位置:"); 21 scanf("%d%d", &r.p1.x, &r.p1.y); 22 printf("请输入第二个点的位置:"); 23 scanf("%d%d", &r.p2.x, &r.p2.y); 24 ret = get(&r); 25 printf("面积是:%d\n", ret); 26 return 0; 27 } 1 /* 2 对齐,补齐演示 3 */ 4 #include <stdio.h> 5 typedef struct { 6 char str[2]; 7 int num; 8 9 } stru; 10 int main() { 11 printf("sizeof(stru)是%d\n", sizeof(stru)); 12 return 0; 13 }结果是8任何变量,它的地址一定是它自身大小的整数倍(double类型变量的大小按4的整数倍计算),这个规则叫做数据对齐数据对齐会造成结构体内部不同子变量之间有空隙一个结构体的大小必须是其内部最大子变量的整数倍(double类型变量的大小按4的整数倍计算), 这个规则叫做数据补齐数据补齐可能造成结构体在最后多占用一些浪费的字节 结构体中子变量的顺序会影响结构体的大小 练习:一个班有五个学生,每个学生参加三门期末考试(语文,数学,英语),用一个结构体记录一个学生的所有成绩,编写一个函数计算出这个班每门科目的平均成绩,并记录在一个结构体中,最后把所有平均成绩打印在屏幕上。 1 #include <stdio.h> 2 typedef struct grade { 3 double ch; 4 double math; 5 double eng; 6 } grade; 7 8 typedef struct average { 9 double a_ch; 10 double a_math; 11 double a_eng; 12 } average; 13 14 void print() { 15 grade g1, g2, g3, g4, g5; //分别表示五个学生的成绩 16 average average; 17 printf("请输入第一个学生的成绩:"); 18 scanf("%lf%lf%lf", &g1.ch, &g1.math, &g1.eng); 19 printf("请输入第二个学生的成绩:"); 20 scanf("%lf%lf%lf", &g2.ch, &g2.math, &g2.eng); 21 printf("请输入第三个学生的成绩:"); 22 scanf("%lf%lf%lf", &g3.ch, &g3.math, &g3.eng); 23 printf("请输入第四个学生的成绩:"); 24 scanf("%lf%lf%lf", &g4.ch, &g4.math, &g4.eng); 25 printf("请输入第五个学生的成绩:"); 26 scanf("%lf%lf%lf", &g5.ch, &g5.math, &g5.eng); 27 average.a_ch = (g1.ch + g2.ch + g3.ch + g4.ch + g5.ch) / 5. 0; 28 average.a_math = (g1.math + g2.math + g3.math + g4.math + g 5.math) / 5.0; 29 average.a_eng = (g1.eng + g2.eng + g3.eng + g4.eng + g5.eng ) / 5.0; 30 printf("平均成绩为:%g %g %g\n", average.a_ch, average.a_ma th, average.a_eng); 31 } 32 33 int main() { 34 print(); 35 return 0; 36 } 或者: #include <stdio.h>typedef struct { int chn; int math; int eng;} rank;rank *ave(const rank *p_rank, int size, rank *p_ave) { int num = 0; for(num = 0; num <= size - 1; num++) { p_ave->chn += (p_rank + num)->chn; p_ave->math += (p_rank + num)->math; p_ave->eng += (p_rank + num)->eng; } p_ave->chn /= size; p_ave->math /= size; p_ave->eng /= size; return p_ave;}int main() { rank ranks[5] = {}; rank ave_rank = {}; int num = 0; for(num = 0; num <= 4; num++) { printf("请输入第%d个学生的成绩:", num + 1); scanf("%d%d%d", &ranks[num].chn, &ranks[num].math, &ranks[num].eng); } ave(ranks, 5, &ave_rank); printf("语文平均成绩是%d\n", ave_rank.chn); printf("数学平均成绩是%d\n", ave_rank.math); printf("英语平均成绩是%d\n", ave_rank.eng); return 0;}枚举类型可以把一组相关名称转换成数字枚举类型:
1 #include <stdio.h> 2 int main() { 3 enum {SPR, SUM, AUT, WIN}; 4 printf("AUT是%d\n", AUT); 5 return 0; 6 } 转换成的数字从0开始依次递增联合类型:联合中所有子变量都占有同样的存储位置,他们之间是互相影响的 1 #include <stdio.h> 2 typedef union un { 3 char ch[2]; 4 int num; 5 } un; 6 int main() { 7 un un1; 8 un1.num = 0; 9 un1.ch[0] = 'a'; 10 un1.ch[1] = 'b'; 11 printf("un1.num是%x\n", un1.num); 12 return 0; 13 }