1. 程式人生 > >《你的月亮我的C》(一):型別定義(typedef)

《你的月亮我的C》(一):型別定義(typedef)

    “typedef關鍵字儘管在語法上是一種儲存型別,但正如其名所示,它用來定義新的型別名稱,而不是定義新的變數或函式”

                                                                                                                                                                —Steve Summit

一、typedef#define有什麼不同?

#define是基於文字的字元替換,不做型別檢查。而typedef的替換並不完全基於文字,它不是簡單的字元替換,它定義一種型別的別名,

typedef的優點是可以用作同時宣告多個指標型別的物件。舉個例子:

這樣宣告的話,S1S2中只有S1被定義為char *字元指標,而S2被定義為char型字元變數。所以說有時想定義兩個指標變數時,使用#define做字元替換可能會出錯。

二、C語言結構體中可以包含指向自己的指標?

當然可以。

那為什麼這樣定義不行:


我們來看下編譯器報錯:


問題在於,不能在定義typedef型別前使用它,在上圖中,對於Next的定義前還沒有定義*Node,所以編譯器報錯。

C語言允許同時定義一個新的typedef型別和結構體型別。所以解決的辦法有兩個。

1、:在定義typedef型別和結構體型別後,給結構體型別一個標籤。


然後在定義

Next時定義為struct QNode *的指標。

2、typedef定義新型別和結構體定義分開來。


在定義結構體前先定義typedef型別,然後在結構體內定義Next時就可以用Node來聲明瞭。

三、為什麼不能在初始化陣列大小時使用const限定值?

例子:


(摘自:Steve Summit“因為const限定詞真正的含義時“只讀”,用它限定的物件通常時執行時不能被賦值的物件。因此用const限定的物件的值並不完全是一個真正的常量,不能用作陣列維度、case行標或類似環境。”

如果你真的需要一個編譯時的常量,那麼可以使用編譯預處理巨集#define


四、const char *pchar const *p

char * const p有什麼區別?

const char *pchar const *p是一樣的,它們都是定義了一個指向字元常量的指標(就是說這個指標所指向的字元不能被改變)。而char * const p意思是定義一個字元指標,這個指標本身不可改變,但指標指向的字元可以被改變。

五、struct S1{....};typedef struct {....} S2;有什麼不同?

舉例:


第一種struct S1聲明瞭一個結構體標籤(structure tag)“S1”。第二種聲明瞭一個typedef型別定義的結構體,在宣告typedef型別定義的結構體例項時不需要使用struct關鍵字(第15-16行)。