C語言之結構型別

2021-09-11 08:04:48 字數 2114 閱讀 7686

列舉是一種使用者定義的資料型別,它用關鍵字enum宣告如下:

enum 列舉型別名稱;
列舉型別名字通常並不真的使用,要用d是在大括號裡的名字,因為它們就是常量符號,它們的型別是int,值則依次從0到n。

如:enum colors;

建立了三個常量,red的值時0,yellow的值是1,而green的值是2.

宣告列舉量的時候可以指定值。

enum color;

列舉只是int。

雖然列舉型別可以當做型別使用,但是實際上很少使用,也不好用。

列舉比巨集(macro)好,因為列舉有int型別。

宣告結構型別:

//形式1

struct point;

struct point p1, p2; //p1和p2都是point,裡面有x和y的值

//形式2

struct p1, p2; //p1和p2都是一種無名結構,裡面有x和y

//形式3

struct pointp1, p2; //p1和p2都是point,裡面有x和y的值

對於上面第一和第三種形式,都宣告了結構point,但是第二種形式沒有宣告point,只是定義了兩個變數。

和本地變數一樣,在函式內部宣告的結構型別只能在函式內部使用,所以一般在函式外部宣告結構型別,這樣就可以被多個函式所使用了。

結構和陣列有點像,陣列用訪問其成員,而結構用.運算子訪問其成員。

要訪問整個結構,直接用結構變數的名字。

對於整個結構,可以做賦值,取位址,也可以傳遞給函式引數。

p1 = (struct point);     //相當於p1.x = 5;    p2.y = 10;

p1 = p2;    //相當於p1.x = p2.x;    p1.y = p2.y;      陣列是無法做這兩種運算的。

復合字面量:

today = (struct date);

today = (struct date);

和陣列不同,結構變數的名字並不是結構變數的位址,必須使用&運算子。

struct date *pdate = &today;
結構作為函式引數:int numberofdays(struct date d)

整個結構可以作為引數的值傳入函式。

這時候是在函式內新建乙個結構變數,並複製呼叫者的結構的值。

函式也可以返回乙個結構,這和陣列不同。

struct datemyday;

struct date *p = &myday;

(*p).month = 12;

p->month = 12;

上面用->表示指標所指的結構變數中的成員。

typedef(自定義資料型別):c語言提供了乙個叫做typedef的功能來宣告乙個已有的資料型別的新名字,如:

typedef int length;

使得length成為int型別的別名。

這樣,length就可以代替int出現在變數定義和引數宣告的地方了。

typedef struct adatedate;        //簡化了複雜的名字。

date d = ;

union aneltelt1, elt2;

elt1.i = 4;

elt2.c = 'a';

elt2.i = 0xdeadbeef;

上述聯合定義在記憶體中的分布如下圖:

所以sizeof(union)等於sizeof(每個成員)的最大值。

所有的成員共享乙個空間,同一時間只有乙個成員是有效的。

union的大小是其最大的成員。

對聯合第乙個成員進行初始化。

C語言之列舉型別

如果乙個變數有幾種可能的值,則可以定義為列舉型別,就是把各種存在的值一一的列舉出來。列舉在c c c 中,是乙個被命名的整型常數的集合。它可以讓資料更簡潔,更易讀。接下來我們舉個例子,比如 一星期有 7 天,如果不用列舉,我們需要使用 define 來為每個整數定義乙個別名 define mon 1...

C語言之布林型別

c 語言標準 c89 沒有定義布林型別,所以 c 語言判斷真假時以0為假,非0為真但這種做法不直觀,所以我們可以借助 c 語言的巨集定義 c 語言標準 c99 提供了 bool型,bool仍是整數型別,但與一般整型不同的是,bool變數只能賦值為0或1,非 0的值都會被儲存為1,c99還提供了乙個標...

C語言之字元型別

字元常量是用單引號 括起來的單個字元。例如 char c1 a char c3 9 c 中還允許使用轉義字元 來將其後的字元轉變為特殊字元型常量。例如 char c3 n n 表示換行 在 c 中,char的本質是乙個整數,在輸出時,是ascii碼對應的字元。可以直接給char賦乙個整數,然後輸出時...