在**之中使用typedef宣告有助於建立與平台無關的型別,隱藏c和c++語言中複雜和難以理解的符合型別,創造更為美觀的**。
但是typedef的使用卻有一些很容易混淆的地方,簡單的用法還可以,稍微複雜一些的用法我就搞不懂了。在網上搜了一些資料,
看了看,自己總結了一下。
一、譚浩強版的用typedef定義已有的型別名的別名的步驟如下:
(1)先按定義變數的方法寫出定義體;
(2)將變數名換成新型別名;
(3)在最前面加typedef;
(4)之後就可以用新型別名去定義變數。
二、typedef用法
1、最簡單的用法
如:typedef int myint;
myint sn; //相當於int sn;
是將myint作為int型別的同義詞。
2、用typedef定義復合型別陣列型別的同義詞
如例所示typedef char word[20];
word w1, w2; //相當於char w1[20]; char w2[20];
則word就成了包含20個元素的char陣列型別的同義詞。
3、用typedef定義簡單的復合的指標型別同義詞
先看c和c++中指標型別糾結的定義。
char* pa, pb;
char *pc, *pd;
其中pa是char指標型別而pb不是,這多半不符合我們的常規理解方式,如果想要定義兩個char指標,則必須像定義pc和pd那樣;而且*的位置沒有影響。
但是利用typedef我們卻可以定義char*這種復合型別的同義詞。如下所示:
typedef char * chpointer;
chpointer pi, po;這樣pi和po都是char指標型別了。
這裡還有一些需要注意的地方。如下:
有函式int mystrcmp(const char*, const char*) ;
如果定義typedef char* pstr;而且宣告mystrcmp()如下:
int mystrcmp(const pstr, const pstr),那麼這將是錯誤的。因為函式原型中的引數是指向char常量的指標,而宣告的卻是指向char的指標常量。
對於這一點我想必須要理解typedef不只是簡單的巨集替換。應該從它所表示的意義上去理解。typedef char* pstr定義的是乙個指向char的指標,
所以const pstr中const修飾的是乙個指標,也就是說const pstr 表示的是乙個char型指標常量。
要解決不一致的問題可以這樣:typedef const char* pstr;這樣宣告函式就變成了:
int mystrcmp(pstr, pstr);
4、typedef用於struct的用法
在舊的c的**中宣告struct新物件時,必須要帶上struct,即形式為:
struct 結構名 物件名,如:
struct point
;struct point pot;
而在c++中,則可以直接寫:結構名 物件名,即:point pot;
為了在c**的結構體宣告中少寫乙個struct是**更為緊湊和簡約,就有了如下的宣告方法:
typedef struct point
point;
這樣的一段**實際上做了兩件事情:
(1)struct point
;(2)
typedef struct point point;
以後就可以這樣宣告struct point型別的變數了:point pot;顯得簡約一點。
5、typedef隱藏複雜型別的用法
此種用法主要體現在定義函式型的指標上。關鍵點在於根據運算子的結合性,逐步理解其所代表的意義。
(1) 先看c語言中關於函式的宣告
int function(int ,char);
其對應的函式指標宣告為:int (*fp) (int,char);
當進行賦值時可以有以下形式:
fp = &function;函式呼叫時的形式為:(*fp)(int, char)。
fp = function; 函式呼叫時的形式為: fp(int, char)。
(2)再看c語言中關於陣列的宣告
int sn[6];
其對應的陣列指標宣告為int (*ps)[6];注意括號的使用,因為的優先順序大於*。
使用方式為:ps = &sn; int a = (*ps)[0]。
(3)再看以下三個變數宣告
#1 int* (*a[6])(char*,int*);
#2 void (*b[6])(int(*)());
#3 int(*)() (*p)[6];
然後再來分析以上宣告所代表的意義。
#1int* (*a[6])(char*,int*);
首先看變數名a,因為的結合性大於*,所以a首先是乙個陣列,然後每個陣列元素都是乙個指標;再看括號外邊是乙個函式的宣告形式,所以a陣列中的每乙個元素都是指向函式的指標。這種函式返回值為int*型,引數形式為(char*,int*)。
用typedef來簡化此種型別宣告:
typedef int* (*pa)(char*, int*);
pa a[6];同int* (*a[6])(char*,int*);
#2void (*b[6])(int(*)());
類似於#1,b是乙個陣列,每個元素是乙個指標,這個指標指向乙個函式,函式的返回值為void,引數為int(*)()(也就是乙個函式,返回值為int無引數)。
用typedef來簡化此種型別宣告:
typedef void (*pb)(int (*)() );
pb b[6];同void (*b[6])(int(*)());
當然還可以逐步簡化:
typedef int (*pi) ();簡化指標指向的函式的引數;
typedef void (*pb)(pi);
pb b[6];同void (*b[6])(int(*)())。
#3int(*)() (*p)[6];
首先p是乙個指標,p指向了乙個陣列,這個陣列的每乙個元素為指向函式的指標,指向的函式型別是返回值為int無引數。
用typedef來簡化此種型別宣告:
typedef int(*pi)();簡化陣列的元素定義;
typedef pi (*pp)[6];
pp p;同int(*)() (*p)[6];
(4)2個模式:
type (*)(....) 函式指標 type (*) 陣列指標
關鍵還在於根據運算子的結合性,理解typedef定義的型別的意義,c語言在很多類似的地方都讓人糾結。
C 中typedef的用法
ypedef的四個用途和兩個陷阱 用途一 定義一種型別的別名,而不只是簡單的巨集替換。可以用作同時宣告指標型的多個物件。比如 char pa,pb 這多數不符合我們的意圖,它只宣告了乙個指向字元變數的指標,和乙個字元變數 以下則可行 typedef char pchar 一般用大寫 pchar pa...
C 中typedef用法說明
typedef宣告提供了一種將識別符號宣告為型別別名的方法,用於替換複雜的型別名。解釋 在宣告中使用typedef說明符時,會指定這個宣告是typedef宣告,而不是變數或函式宣告。通常,typedef說明符出現在宣告的開頭,但允許它出現在型別說明符之後,或者出現在兩個型別說明符之間。typedef...
typedef和struct的用法問題(c)
若有 typedef struct str,p,str 5 typedef int int 尾部要有 int a 相當於int a typede int int p int p p a 相當於int p a 注意 define int p int int p a,b 相當於int a int b 與...