C語言筆記之typedef

2021-06-29 16:19:15 字數 1972 閱讀 3915

typedef 這個關鍵字用於給乙個型別起個新的名字,和define不同, typedef 給出的符號名稱僅限於對型別 , 而不是對值。下面是乙個例子:

typedef short wchar;   

typedef將short型別定義成wchar型別,那麼以後遇到 wchar a; 其實就是 short a;  如果沒有typedef這個關鍵字,wchar就是乙個變數名,加上typedef,wchar就成了型別名。型別名也遵循識別符號的命名規則,並且通常加個 _t 字尾,表示type。

這樣做有什麼用處呢?僅僅從short這種基本型別是看不出來好處的,typedef的強大之處在於重定義復合型別,給復合型別乙個新的名字,以後就可以直接使用新名字來宣告變數,而不必寫一堆長長的復合型別。當然,某些情況下,也需要對基本型別重新命名,比如平台移植之類的。

下面分幾種情況描述typedef的用法。

1、指標

考慮這麼乙個宣告:

typedef char * string;

那麼string就是乙個指標型別,它指向char型別。於是,

string a,b;  

就定義了兩個指標變數,它們都指向char型別的變數。相當於:

char *a, *b;

2、陣列

typedef int  array[5];

array就是一種新型別,它代表有5個int型別數值的陣列,array  new;  就相當於 int new[5];

這個形式理解起來有點費力,可以採用上面的方法:如果沒有typedef,那麼array就是乙個普通的陣列名;有了typedef , array就成了乙個型別名。

3、結構體

結構是typedef的主要戰場,因為一般結構體實在太長了,只有重新命名才能簡化**。比如下面這個:

struct sth;

然後,宣告變數時雖然可以這樣: struct sth one, two;  但是每次都要寫乙個struct仍然比較煩。好的辦法是這樣:

typedef struct sth;

然後就可以直接 sth one, two; 了。

4、函式

你沒看錯,typedef甚至可以定義函式型別!!如下:

typedef int func(double var);

這樣就定義了乙個函式型別func,以後就可以用func來定義變數。這條語句的理解同上面,先去掉typedef,再加上typedef,看func的含義變化。

比如下面的語句定義了乙個func型變數:

func a;

但是這個變數不能被賦值,因為這條語句相當於做了乙個宣告:

int a(double var);

然而這也是定義func型別的初衷,定義func型別是為了方便定義指向此類函式的指標,如下:

func *a;

這樣就定義了乙個函式指標a,它只能指向func型別的函式,所謂func型別的函式是指:返回值為int,而引數只有乙個double。也就是說,判斷乙個函式是不是func型的,只需要檢查它的返回值型別,引數個數及型別,而不管具體的實現。

比如下面實現了兩個func型函式:

int func1(double var1)

return (int)var1;

int func2(double var2)

return 0;

那麼我們可以令a = &func1; 也可以 a = &func2;

這裡需要**一下函式名到底意味著什麼?實際上,函式名同陣列名一樣,是乙個位址。陣列名代表著陣列首元素的位址,函式名代表著函式第一條指令的位址。

既然函式名就是位址,我們當然也可以這樣賦值:a = func1;  這同陣列名是一樣的,但是這種賦值暗含了型別轉換,func1是func函式型別(的變數?),而&func1則是函式指標型別(的變數?),只是做右值時自動型別轉換罷了。

賦值時候才可以直接使用函式指標,如:

a(2.6);

相當於呼叫func1(2.6);(如果a = func1)

以上就是typedef的一些主要用法。

C語言入門學習筆記之typedef簡介

在微控制器和作業系統中 typedef 會經常用到,它可以為某乙個型別自定義名稱。和 define比較類似。但是又有不同的地方。下面使用typedef定義乙個資料型別 int main 使用typedef將unsigned char型別重新定義為byte型別,然後在使用新的型別byte定義乙個變數c...

C語言系列文章之typedef

typedef 應該算是很熟悉的關鍵字了,但是我也只是簡單使用罷了,為了比較系統的講述這一小節,特地上網搜了一下。好了,現在正式開始講解。typedef 關鍵字可以用於給資料型別定義乙個別名,比如說你本名叫關谷神奇,我嫌棄這個名字太長了,所以給你取乙個別名,叫關谷,以後我叫關谷的時候你就知道在叫你了...

C語言筆記 define與typedef的區別

define是預處理指令,在編譯時不進行任何檢查,只進行簡單的替換 巨集定義的一般形式為 define 巨集名 字串這裡所說的字串是一般意義上的字串行,不要和c語言中的字串等同,它不需要雙引號。typedef是在c語言中用來為複雜的宣告定義簡單的別名,它本身是一種儲存類的關鍵字,與auto exte...