列舉是一種使用者定義的資料型別,它用關鍵字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賦乙個整數,然後輸出時...