zoukankan      html  css  js  c++  java
  • 20170504

    结构体变量可以作为函数的形参和返回值使用(不要这么做,因为结构体变量中可能包含非常多的东西,在调用过程中很花时间)
    使用结构体变量作为形参或返回值会浪费时间和空间,所以应该使用结构体指针作为形参和返回值
    例子:
      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 ", 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 ", 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 ", 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 ", average.a_ch, average.a_ma    th, average.a_eng);
     31 }
     32
     33 int main() {
     34     print();
     35     return 0;
     36 }

  • 相关阅读:
    “嫦娥一号”探月卫星成功发射
    优化SQL Server数据库查询(转)
    虚拟网络连接设置
    字符串分割自定义函数(SQL)
    做程序的劫客
    Linux学习笔记12我的第一个C程序
    C#学习笔记——25个经典问题
    C#学习笔记——回调机制
    C#学习笔记——TCP通讯
    halcon学习笔记——实例篇(2)长度和角度测量
  • 原文地址:https://www.cnblogs.com/dongjian16/p/6809396.html
Copyright © 2011-2022 走看看