C和C 中typedef的用法分析

2021-05-26 18:54:22 字數 3362 閱讀 2534

在**之中使用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 與...