引言:
typedef能夠看作type define的縮寫,顧名思義就是型別定義,也就是說它僅僅是給已有的型別又一次定義了乙個方便使用的別名。並沒有產生新的資料型別。
typedef與define的不同
★★★★★
1.與#define不同,typedef給出的符號名稱僅限於對型別,而不是對值。
2.typedef的解釋由編譯器,而不是預處理器執行。
3.typedef比#define更靈活。
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 = ;
注意事項
★★★★
★
1、使用typedef定義的作用域取決於typedef語句所在的位置,假設定義是在乙個函式內部,它的作用域就是區域性的,限定在那個函式裡。
假設定義是在函式外部。它將具有全域性作用域。
2、typedef中宣告的型別在變數名的位置出現。而不是緊接在keywordtypedef之後。
3、typedef在語法上類似於儲存類中的extern、static等,所以不能同一時候對乙個變數型別使用typedef和static等。
4、建立好資料型別名之後,能夠使用它來進行型別宣告、型別轉換等。如:
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 型別的返回值。對複雜變數建立乙個型別別名的方法非常easy,你僅僅要在傳統的變數宣告表示式裡用型別名替代變數名。然後把keywordtypedef加在該語句的開頭即可了。
比方: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的作用;同理這個函式也是這樣。
分析複雜宣告的方法
★★★★
★理解複雜宣告可用的「右左法則」:從變數名看起,先往右,再往左。碰到乙個圓括號就調轉閱讀的方向;括號內分析完就跳出括號。還是按先右後左的順序。如此迴圈,直到整個宣告分析完。舉例:
1、int (*func)(int *p);
首先找到變數名func,外面有一對圓括號,並且左邊是乙個*號,這說明func是乙個指標;然後跳出這個圓括號,先看右邊,又遇到圓括號,這說明(*func)是乙個函式。所以func是乙個指向這類函式的指標,即函式指標,這類函式具有int*型別的形參,返回值型別是int。
2、int (*func[5])(int *);
func右邊是乙個運算子,說明func是具有5個元素的陣列。func的左邊有乙個*,說明func的元素是指標(注意這裡的*不是修飾func,而是修飾func[5]的。原因是運算子優先順序比*高,func先跟結合)。跳出這個括號。看右邊。又遇到圓括號,說明func陣列的元素是函式型別的指標,它指向的函式具有int*型別的形參,返回值型別為int。
參考:
C語言天天練(二) statickeyword
引言 statickeyword不僅能夠修飾變數。並且能夠修飾函式。了解它的使用方法,不僅對閱讀別人的 有幫助,也有助於自己寫出更加健壯的程式。使用方法 用於不同的上下文環境時,statickeyword具有不同的意義。一 當它用於函式定義時,或用於 塊之外的變數宣告時,statickeyword用...
C語言天天練(十) 結構體
引言 資料經常以成組的形式存在。在c中,使用結構可以把不同型別的值存放在一起。結構的宣告有兩種 1 struct 然後用標籤 去宣告結構體變數。2 typedef struct 然後用 去宣告結構體變數。此時 是個型別名,而不像上面的 是個標籤。結構成員可以是標量 陣列 指標甚至是其他結構。結構成員...
C語言天天練(二四) 記憶體分配
引言 對於c語言程式,了解它執行時在記憶體中是怎樣分配的對於我們理解它的執行機制是很實用的。以下就總結一下c語言程式的一些記憶體分配知識。一 一段c程式。編譯連線後形成的可執行檔案一般有 段 資料段 堆和棧等幾部分組成。當中資料段又包含僅僅讀資料段 已初始化的讀寫資料段和未初始化的bss段。例如以下...