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. 結構類型和結構變量是否占用內存?
  • 解決:結構體類型的定義只是告訴編譯器該如何表示數據,但是它沒有讓計算機為其分配空間。定義一個結構體一般是不分配內存,聲明一個結構體變量是分配內存的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM