C語言之typedef詳解

2021-08-02 09:36:56 字數 2324 閱讀 8663

typedef可以看作type define的縮寫,顧名思義就是型別定義,也就是說它只是給已有的型別重新定義了乙個方便使用的別名,並沒有產生新的資料型別。

typedef的使用與巨集定義define有些許的相似,但兩者又有以下不同:

1.與#define不同,typedef給出的符號名稱僅限於對型別,而不是對值。

2.typedef的解釋由編譯器,而不是預處理器執行。

3.typedef比#define更靈活。

既然typedef沒有定義新的資料型別,那麼為什麼還要使用它呢?使用typedef有其自身的優勢:

1.它使得定義更加直觀,從定義就可了解變數的某些資訊。如

typedef unsigned int byte;

byte x, y[10], *z;

2.它可以使程式引數化,以提高程式的可移植性。如

time_t time(time_t *); 該函式返回的是time_t 型別的返回值,有些系統中 time_t 被定義為unsigned long型別,而另外一些系統中,可能被定義為unsigned int 型別,這樣,在移植到不同的系統中時,只要改變typedef定義,就可以在不同的系統中進行移植了。

3.表達方式更加簡潔。如

使用typedef命名乙個結構體時,typedef structrect; rect r1 = ;

如果不使用typedef則顯得複雜,struct r1 = ;

使用typedef定義的作用域取決於typedef語句所在的位置,如果定義是在乙個函式內部,它的作用域就是區域性的,限定在那個函式裡。如果定義是在函式外部,它將具有全域性作用域。typedef中宣告的型別在變數名的位置出現,而不是緊接在關鍵字typedef之後。typedef在語法上類似於儲存類中的extern、static等,所以不能同時對乙個變數型別使用typedef和static等。建立好資料型別名之後,可以使用它來進行型別宣告、型別轉換等。如:

typedef char *string;

string p, lineptr[maxlines], alloc(int); //型別宣告

int strcmp(string, string);

p = (string)malloc(100); //型別轉換

typedef的常用範例如下:

1.簡單的定義變數的別名。

typedef char * pchar;

pchar a, b; //相當於char *a; char *b;

2.與結構體的結合使用。

typedef struct node*pnode;

pnode a, b;

3.對複雜的變數定義乙個型別別名。

下面是參考別的部落格的內容:

typedef int (*pf) (const char *, const char *);這個宣告引入了 pf 型別作為函式指標的同義字,該函式有兩個 const char * 型別的引數以及乙個 int 型別的返回值。對複雜變數建立乙個型別別名的方法很簡單,你只要在傳統的變數宣告表示式裡用型別名替代變數名,然後把關鍵字typedef加在該語句的開頭就行了。比如:

void (*signal (int signr,void (*handler)(int))) (int);可以通過兩次typedef來進行定義。

typedef void sigfunc(int);

sigfunc *signal(int signr,sigfunc *handler);

其中typedef定義了乙個有乙個整型引數無返回值的函式型別。void (*handler)(int)表示乙個有乙個整型引數無返回值的函式指標,這個指標名為handler,所以其可以用sigfunc進行說明,此時sigfunc就相當於前面的int signr中int的作用;同理這個函式也是這樣。

理解複雜宣告可用的「右左法則」:從變數名看起,先往右,再往左,碰到乙個圓括號就調轉閱讀的方向;括號內分析完就跳出括號,還是按先右後左的順序,如此迴圈,直到整個宣告分析完。舉例:

int (*func)(int *p); 

首先找到變數名func,外面有一對圓括號,而且左邊是乙個*號,這說明func是乙個指標;然後跳出這個圓括號,先看右邊,又遇到圓括號,這說明(*func)是乙個函式,所以func是乙個指向這類函式的指標,即函式指標,這類函式具有int*型別的形參,返回值型別是int。 

int (*func[5])(int *); 

func右邊是乙個運算子,說明func是具有5個元素的陣列;func的左邊有乙個*,說明func的元素是指標(注意這裡的*不是修飾func,而是修飾func[5]的,原因是運算子優先順序比*高,func先跟結合)。跳出這個括號,看右邊,又遇到圓括號,說明func陣列的元素是函式型別的指標,它指向的函式具有int*型別的形參,返回值型別為int。 

C語言之typedef詳解

typedef可以看作type define的縮寫,顧名思義就是型別定義,也就是說它只是給已有的型別重新定義了乙個方便使用的別名,並沒有產生新的資料型別。typedef的使用與巨集定義define有些許的相似,但兩者又有以下不同 1.與 define不同,typedef給出的符號名稱僅限於對型別,而...

C語言之typedef的問題

1.基本解釋 typedef為c語言的關鍵字,作用是為一種資料型別定義乙個新名字。這裡的資料型別包括內部資料型別 int,char等 和自定義的資料型別 struct等 在程式設計中使用typedef目的一般有兩個,乙個是給變數乙個易記且意義明確的新名字,另乙個是簡化一些比較複雜的型別宣告。至於ty...

C語言之typedef的問題

c語言之typedef的問題 1.基本解釋 typedef為c語言的關鍵字,作用是為一種資料 型別定義乙個新名字。這裡的資料 型別包括內部資料 型別 int,char等 和自定義的資料 型別 struct等 在程式設計中使用typedef目的一般有兩個,乙個是給變數乙個易記且意義明確的新名字,另乙個...