首页 > 代码库 > 20170505
20170505
结构体变量可以作为函数的形参和返回值使用(不要这么做,因为结构体变量中可能包含非常多的东西,在调用过程中很花时间)
使用结构体变量作为形参或返回值会浪费时间和空间,所以应该使用结构体指针作为形参和返回值
例子:
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;
}
枚举类型可以把一组相关名称转换成数字
20170505