天天看點

C語言結構類型_筆記

C語言結構類型

本篇文章為個人在學習C語言結構類型過程中的筆記和總結,有不足之處還請大神指正。

1.枚舉類型

⭐符号常量化:用符号而不是具體的數字來表示程式中的數字,是程式能夠簡潔、便于閱讀

const int red = 0;
const int yellow = 1;
const int green = 2;      

枚舉類型可以更加友善的方式定義常量:

枚舉類型: 枚舉是一種使用者定義的資料類型,用關鍵字 enum 以如下文法來表明

enum 枚舉類型名字 {名字0,...,名字n};

enum COLOR {RED. YELLOW, GREEN};

第二行語句建立三個常量,其值按順序排列,即:RED = 0; YELLOW = 1; GREEN = 2;(也可以單獨定義,在初始化的時候指派)

當需要一些可以排列起來的常量值的時候,定義枚舉類型的意義就是給這些常量值名字

  • 枚舉量可以作為值
  • 枚舉類型可以跟上enum作為類型:

enum COLOR {RED. YELLOW, GREEN};

void function(enum color c){...};

int main(){

enum corlor a = RED;

}

  • 編譯時實際上是以整數執行内部運算以及外部輸入輸出的

枚舉的優點:如果有意義上排比的名字,枚舉定義比用const int 定義更友善;枚舉比宏定義更好,因為枚舉有int類型。

2.結構類型

結構類型(結構體)可以使用一個類型來表示多個子類型的集合,其中每一個子類型成為該結構的成員。

結構類型的聲明和使用:

struct data {
    type name0;        //type:類型; name:成員名
    type name1;
    ...
};

struct data a;      

上述定義方式在使用時為了友善,常使用typedef進行轉義簡化,如:

typedef struct data{
    type name;
    ...
}data;    //之後可以使用data來表示struct data類型聲明;      

結構類型還有另外的聲明方式:

struct {
    type name0;        //type:類型; name:成員名
    type name1;
    ...
}a1,a2;                //a1和a2都是一種無名結構,裡面都有成員name0和name1...
//注意:上述的方式僅僅定義了兩個變量a1、a2,而沒有聲明結構類型data!!!
struct data {
    type name0;        //type:類型; name:成員名
    type name1;
    ...
}b1,b2;                //b1和b2都是data類型,裡面都有成員name0和name1...
//既定義了變量同時又聲明了結構類型      
結構類型可以在函數内/外定義,通常定義在函數外,這樣結構類型可以被全局使用。

通路結構成員:

結構一般使用 ‘.’ 運算符和名字通路其成員,例如:

data.name0
data.name1      

結構運算

  • 要通路整個結構,直接用結構變量的名字
  • 對于整個結構可以做指派、取位址,也可以傳遞給函數參數
a = (stryct data){1,2};    //假設name0和name1類型為int,那麼相當于a.name0=1,a.name1=2;      

結構作為函數參數

  • 整個結構可以作為函數參數傳入函數
  • 注意:與普通參數相同,将結構變量作為參數傳入函數僅僅是将值傳遞給了函數,不會對變量的值造成改變和影響!
  • 解決無法傳回結構的方案:可以建立一個臨時結構變量然後傳回,也可以使用結構指針作為參數

指向結構的指針

用 -> 表示指針所指的結構變量中的成員(意義為”所指“)
struct data *getstruct(struct data *p){
    scanf("%d", &p->name0);
    return p;    //這裡傳回一個指針是為了便于使函數參與其他表達式
}      

結構可以嵌套

指向結構數組的指針

定義: 指針變量可以指向一個結構數組,這時結構指針變量的值是整個結構數組的首位址。結構指針變量也可指向結構數組的一個元素,這時結構指針變量的值是該結構數組元素的首位址。

一個結構指針變量雖然可以用來通路結構變量或結構數組元素的成員,但是,不能使它指向一個成員。也就是說不允許取一個成員的位址來賦予它。是以,下面的指派是錯誤的

ps=&boy[1].sex;

而隻能是: ps=boy; //(賦予數組首位址)

或者是: ps=&boy[0]; //(賦予0号元素首位址)

3.聯合類型

聯合類型的定義方式和使用方式與結構類型相似

與結構類型的差別是:聯合結構所有成員共享記憶體空間,聯合類型的所有成員在同一時刻隻能有一個起作用,是以他占用的記憶體空間是所有成員中最大那個的大小。

總結:
  1. 共用體的空間在某一時刻隻有一個成員在起作用。
  2. 共用體變量中的成員是最後一次放入的成員。
  3. 共用體變量不能在定義時賦初值。
  4. 共用體變量不能作為函數的參數或函數值,但可使用指向共用體的指針變量。
  5. 共用體可以作為結構的成員,結構體也可以作為共用體的成員。

繼續閱讀