1 typedef與基本資料型別
typedef 宣告,簡稱 typedef,為現有資料型別建立乙個新的名字。比如人們常常使用typedef 來編寫更美觀和可讀的**。使用 typedef 為現有型別建立同義字。
定義易於記憶的型別名。
typedef 使用最多的地方是建立易於記憶的型別名,用它來歸檔程式設計師的意圖。型別出現在所宣告的變數名字中,位於 ''typedef'' 關鍵字右邊。例如:
typedef int size;
此宣告定義了乙個 int 的同義字,名字為 size。注意 typedef 並不建立新的型別。它僅僅為現有型別新增乙個同義字。
你可以在任何需要 int 的上下文中使用 size:void measure(size * psz);
size array[4];
size len = file.getlength();
std::vector vs;
typedef 還可以掩飾復合型別,如指標和陣列。例如,你不用象下面這樣重複定義有 81 個字元元素的陣列:
char line[81];
char text[81];
定義乙個 typedef,每當要用到相同型別和大小的陣列時,可以這樣:
typedef char line[81];
line text, secondline;
getline(text);
同樣,可以象下面這樣隱藏指標語法:
typedef char * pstr;
int mystrcmp(pstr, pstr);
這裡將帶我們到達第乙個 typedef 陷阱。標準函式 strcmp()有兩個『const char *'型別的引數。因此,它可能會誤導人們象下面這樣宣告 mystrcmp():
int mystrcmp(const pstr, const pstr);
用gnu的gcc和g++編譯器,是會出現警告的,按照順序,『const pstr'被解釋為『const char* 『(乙個指向 char 的常量指標),而不是『char *'(指向char 的指標)。這個問題很容易
解決:typedef const cpstr;
int mystrcmp(cpstr, cpstr); //
現在是正確的。
記住:不管什麼時候,只要為指標宣告 typedef,那麼都要在最終的 typedef 名稱中加乙個 const,以使得該指標本身是常量,而不是物件。
2 typedef與結構體2.1 首先:
在c中定義乙個結構體型別要用typedef:
typedef struct student
stu;
於是在宣告變數的時候就可以直接這樣定義:stu stu1;
如果沒有typedef就必須用struct student stu1;來宣告變數stu1。這裡的stu實際上就是struct student的別名。
另外這裡也可以不寫student,
typedef struct
stu;
但是也就不能這樣定義了:struct student stu1;
而只能這樣定義:stu stu1;
2.2其次:
在c++中如果用typedef的話,又會造成區別:
struct student
stu1;//stu1是乙個變數
typedef struct student2
stu2;//stu2是乙個結構體型別
使用時可以直接訪問stu1.a
但是stu2則必須先 stu2 s2;
然後 s2.a=10;
因為c和c++中對struct的應用是不同的。
2.3 其他
掌握上面兩條就可以了,不過最後我們**個沒多大關係的問題
如果在c程式中我們寫:
typedef struct
aaa,bbb,ccc;
這算什麼呢?
我個人觀察編譯器(vc6)的理解,這相當於
typedef struct
aaa;
typedef aaa bbb;
typedef aaa ccc;
也就是說aaa,bbb,ccc三者都是結構體型別。宣告變數時用任何乙個都可以,在c++中也是如此。但是你要注意的是這個在c++中如果寫掉了typedef關鍵字,那麼aaa,bbb,ccc 將是截然不同的三個物件。
3 typedef與enum
typedef enum表示定義了乙個列舉型的資料結構。
比如你用下面的方式進行定義:
typedef enum
drawmenuitemtype;
你可以用上邊的drawmenuitemtype去定義變數,
例如:drawmenuitemtype data1
data1這個變數的取值就是
dwi_nothing,
dwi_2x2icon,
dwi_icon,
dwi_text,
dwi_fulltext,
dwi_centertext,
dwi_fullcentertext,
dwi_none
中的乙個,這些你都可以自己取值。如果你不賦值的話,預設第乙個取值為零,其後面的依次加1。如果你給dwi_nothing取值為m,相應的它後面的沒有顯示賦值的就要在這個基礎上依次加1,直到遇到顯示賦值的為止。
dwi_2x2icon的值為m+1;dwi_icon的值為m+2.
4 typedef與函式指標
4.1簡單的函式指標的應用。
//形式1:返回型別(*函式名)(參數列)
char (*pfun)( int );
char glfun( int a )
void main()
第一行定義了乙個指標變數pfun。首先我們根據前面提到的「形式1」認識到它是乙個指向某種函式的指標,這種函式引數是乙個int型,返回值是char型別。只有第一句我們還無法使用這個指標,因為我們還未對它進行賦值。
第二行定義了乙個函式glfun()。該函式正好是乙個以int為引數返回char的函式。我們要從指標的層次上理解函式——函式的函式名實際上就是乙個指標,函式名指向該函式的**在記憶體中的首位址
然後就是main()函式了,它的第一句您應該看得懂了——它將函式glfun的位址賦值給變數pfun。main()函式的第二句中*pfun顯然是取pfun所指向位址的內容,當然也就是取出了函式glfun()的內容,然後給定引數為2。
4.2使用typedef
//形式2:typedef 返回型別(*新型別)(參數列)
typedef char (*ptrfun)(int);
ptrfun pfun;
char glfun(int a)
void main()
typedef的功能是定義新的型別。第一句就是定義了一種ptrfun的型別,並定義這種型別為指向某種函式的指標,這種函式以乙個int為引數並返回char型別。後面就可以像使用int,char一樣使用ptrfun了。
第二行的**便使用這個新型別定義了變數pfun,此時就可以像使用形式1一樣使用這個變數了。
5 typedef與#define
5.1#define用法
#define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。例如:#define pi 3.
1415926
程式中的:area=pi*r*r 會替換為3.1415926*r*r
如果你把#define語句中的數字9 寫成字母g 預處理也照樣帶入。
5.2 typedef與#define的區別
typedef是在編譯時處理的。它在自己的作用域內給乙個已經存在的型別乙個別名。
typedef int * int_ptr;
#define int_ptr int *
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說,#define在預處理時進行簡單的替換,而typedef不是簡單替換,而是採用如同定義變數的方法那樣來宣告一種型別。也就是說;
#define int_ptr int *
int_ptr a, b; //相當於int * a, b; 只是簡單的巨集替換
typedef int* int_ptr;
int_ptr a, b; //a, b 都為指向int的指標,typedef為int* 引入了乙個新的助記符
這也說明了為什麼下面觀點成立
//qunkangli(維護成本與程式設計師的創造力的平方成正比)
typedef int * pint ;
#define pint int *
那麼:const pint p ;//p不可更改,但p指向的內容可更改
const pint p ;//p可更改,但是p指向的內容不可更改。
pint是一種指標型別 const pint p 就是把指標給鎖住了p不可更改
而const pint p 是const int * p 鎖的是指標p所指的物件。
注: #define 不是語句不要在行末加分號,否則會連分號一塊置換。
Typedef用法小結
比如定義乙個叫 real 的浮點型別,在目標平台一上,讓它表示最高精度的型別為 typedef long double real 在不支援 long double 的平台二上,改為 typedef double real 在連 double 都不支援的平台三上,改為 typedef float re...
typedef的用法小結
概述是一種在計算機程式語言中用來宣告自定義資料型別,配合各種原有資料型別來達到簡化程式設計的目的的型別定義關鍵字。typedef用法小結 一 using typedef to curb miscreant code typedef 宣告有助於建立平台無關型別,甚至能隱藏複雜和難以理解的語法。不管怎樣...
關於typedef的用法總結
不管實在c還是c 中,typedef這個詞都不少見,當然出現頻率較高的還是在c 中。typedef與 define有些相似,但更多的是不同,特別是在一些複雜的用法上,就完全不同了,看了網上一些c c 的學習者的部落格,其中有一篇關於typedef的總結還是很不錯,由於總結的很好,我就不加修改的引用過...