C语言学习笔记(4)

结构

1.结构类型

  • 函数内/外声明结果类型的区别 和本地变量一样,在函数内部声明的结构类型只能在函数内部使用; 所以通常在函数外部声明结构类型,这样就可以被多个函数所使用了; (全局变量与局部变量)

  • 声明结构类型

    struct point {
        int x;
        int y;
    };
    struct pooint p1, p2;
    //p1和p2都是point,里面有x和y值
    
    struct {
    int x;
    int y;
    }p1,p2;
    //P1和p2都是point,里面有x和y的值
    
    struct point {
    int x;
    int y;
    }p1, p2;
    //p1和p2都是point,里面有x和y的值
    
  • 结构变量:声明了结构类型后用这种类型定义不同的结构变量

    struct date today;
    today.month = 07;
    today.day = 23;
    today.year = 2001;
    
  • 结构初始化

    struct date today = {07, 23, 2001};

    struct date thismonth = {.month = 07, .year = 2001};

    未给day赋值则*day为0;

  • 结构成员

    • 结构和数组有点像

    • 数组的单元必须是相同类型的,而结构的成员可以是不同类型的

    • 结构用 “ . ”运算符和名字访问其成员

      today.day student.firstName

  • 结构运算

    • 要访问整个结构,直接用结构变量的命字

    • 对于整个结构,可以做赋值、取地址、也可以传递给参数

      p1 = (struct point){5,10}; //即 p1.x =5; p1.y = 10;

      p1 = p2; // 即 p1.x = p2.x; p1.y = p2.y;

  • 结构指针

    和数组不同,结构变量的名字并不是结构的地址,必须使用“&”运算符;

    strict date *pDate = &today;

    • 用*p访问结构成员
    • 用指向运算符->访问指针指向的结构成员

2.结构与函数

  • 结构作为函数参数

    int numberOfDays (struct date d)

    • 整个结构可以作为参数的值传入函数;
    • 这时候是在函数内新建一个结构变量,并复制调用者的结构的值;
    • 也可以返回一个结构;这与数组完全不同;
  • 输入结构

    • 没有直接的方式可以一次scanf一个结构;
    • C在函数调用时是传值的,在函数中p与main中的y是不同的,在函数读入了p的数值后,没有任何东西回到main,所以y还是{0,0}
    • 可以创建一个临时的结构变量,然后把这个结构返回给调用者
  • 结构指针作为参数

    • 指向结构的指针

      struct date {
          int month;
          int day;
          int year;
      }myday;
      struct date *p = &myday;
      (*p).month = 12;
      p -> month = 12; //用->表示指针所指结构变量中的成员
      

3.结构中的结构

  • 结构数组

    struct date dates[100];
    struct date dates[] = {{4.5.2005},{2,4,2005}};
    
  • 结构中的结构

    struct dateAndTime{
    struct date sdate;
    struct time stime;
    };
    
  • 结构中的结构

    struct point{
    int x; 
    int y;
    };
    struct rectangle{
    struct point pt1;
    struct point pt2;
    };
    //如果有变量struct rectangle r;
    //就可以有 r.pt1.x和r.pt1.y
    //        r.pt2.x和r.pt2.y
    

我的手写笔记


C语言学习笔记(4)_第1张图片
C语言学习笔记(4)_第2张图片
C语言学习笔记(4)_第3张图片
C语言学习笔记(4)_第4张图片
C语言学习笔记(4)_第5张图片

MOOC代码

C语言学习笔记(4)_第6张图片

我的问题

  1. 运算优先级:
  • 解决:初级运算符( )、、->、. 高于 单目运算符 高于 算数运算符(先乘除后加减) 高于 关系运算符 高于 逻辑运算符(不包括!) 高于 条件运算符 高于 赋值运算符 高于 逗号运算符。
  1. 为什么可以返回结构:
  • 解决:C 语言中函数返回结构体时如果结构体较大, 则在调用函数中产生该结构的临时变量,并将该变量首地址传递给被调用函数,被调用函数返回时根据该地址修改此临时变量的内容,之后在调用函数中再将该变量复制给用户定义的变量,这也正是 C 语言中所谓值传递的工作方式。如果结构体较小, 则函数返回时所用的临时变量可保存在寄存器中,返回后将寄存器的值复制给用户定义的变量即可。

PTA问题

  1. 结构类型和结构变量是否占用内存?
  • 解决:结构体类型的定义只是告诉编译器该如何表示数据,但是它没有让计算机为其分配空间。定义一个结构体一般是不分配内存,声明一个结构体变量是分配内存的。

你可能感兴趣的:(C语言学习笔记(4))