• 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
      

    我的手写笔记






    MOOC代码

    我的问题

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

    PTA问题

    1. 结构类型和结构变量是否占用内存?
    • 解决:结构体类型的定义只是告诉编译器该如何表示数据,但是它没有让计算机为其分配空间。定义一个结构体一般是不分配内存,声明一个结构体变量是分配内存的。
  • 相关阅读:
    手把手搭建一个k8s集群(附搭建脚本)
    SAP 创建package ERROR TO128
    (转载)Tips on using log4net RollingFileAppender by Rohit Gupta
    (Asp.Net)转载用Powershell 建立IIS web site
    代码随想录:哈希表
    代码随想录:二叉树的属性
    知易行难
    代码随想录:二叉树知识清单
    openssl + windows + vs2019 源码编译
    代码随想录:栈与队列
  • 原文地址:https://www.cnblogs.com/ABClazyboy/p/12595068.html
Copyright © 2020-2023  润新知