結構
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代碼

我的問題
- 運算優先級:
- 解決:初級運算符( )、[ ]、->、. 高於 單目運算符 高於 算數運算符(先乘除后加減) 高於 關系運算符 高於 邏輯運算符(不包括!) 高於 條件運算符 高於 賦值運算符 高於 逗號運算符。
- 為什么可以返回結構:
- 解決:C 語言中函數返回結構體時如果結構體較大, 則在調用函數中產生該結構的臨時變量,並將該變量首地址傳遞給被調用函數,被調用函數返回時根據該地址修改此臨時變量的內容,之后在調用函數中再將該變量復制給用戶定義的變量,這也正是 C 語言中所謂值傳遞的工作方式。如果結構體較小, 則函數返回時所用的臨時變量可保存在寄存器中,返回后將寄存器的值復制給用戶定義的變量即可。
PTA問題
- 結構類型和結構變量是否占用內存?
- 解決:結構體類型的定義只是告訴編譯器該如何表示數據,但是它沒有讓計算機為其分配空間。定義一個結構體一般是不分配內存,聲明一個結構體變量是分配內存的。