天天看點

C語言之typedef詳解

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 struct{double x; double y;}rect; rect r1 = {3.0, 6.0};

如果不使用typedef則顯得複雜,struct {double x; double y;}r1 = {3.0, 6.0};

使用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{

int a;

char *b;

}*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來進行定義。

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。 

http://blog.csdn.net/shadow_gz/article/details/4326106

http://blog.163.com/njut_wangjian/blog/static/165796425201232510265243/

繼續閱讀