日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C语言typedef关键字—伟大的缝纫师

發(fā)布時(shí)間:2023/12/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言typedef关键字—伟大的缝纫师 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
關(guān)于馬甲的笑話。有這樣一個(gè)笑話:一個(gè)獵人在河邊抓捕一條蛇,蛇逃進(jìn)了水里。過(guò)一會(huì),一個(gè)烏龜爬到岸邊。獵人一把抓住這個(gè)烏龜,大聲的說(shuō)道:小樣,別你為你穿了個(gè)馬甲我就不認(rèn)識(shí)你了!

typedef 關(guān)鍵字是個(gè)偉大的縫紉師,擅長(zhǎng)做馬甲,任何東西穿上這個(gè)馬甲就立馬變樣。它可以把狼變成一頭羊,也能把羊變成一頭狼。甚至還可以把長(zhǎng)著翅膀的鳥人變成天使,同樣也能把美麗的天使變成鳥人。所以,你千萬(wàn)不要得罪它,一定要掌握它的脾氣,不然哪天我把你當(dāng)鳥人,你可別怪我。^_^。

一、歷史的誤會(huì)——也許應(yīng)該是typerename。

很多人認(rèn)為typedef 是定義新的數(shù)據(jù)類型,這可能與這個(gè)關(guān)鍵字有關(guān)。本來(lái)嘛,type 是數(shù)據(jù)類型的意思;def(ine)是定義的意思,合起來(lái)就是定義數(shù)據(jù)類型啦。不過(guò)很遺憾,這種理解是不正確的。也許這個(gè)關(guān)鍵字該被替換為“typerename”或是別的詞。 typedef 的真正意思是給一個(gè)已經(jīng)存在的數(shù)據(jù)類型(注意:是類型不是變量)取一個(gè)別名,而非定義一個(gè)新的數(shù)據(jù)類型。比如:華美絕倫的芍藥,就有個(gè)別名---“將離”。中國(guó)古代男女交往,往往以芍藥相贈(zèng),表達(dá)惜別之情,送芍藥就意味著即將分離。所以文人墨客就給芍藥取了個(gè)意味深長(zhǎng)的別名-----“將離”。這個(gè)新的名字就表達(dá)了那種依依不舍的惜別之情…這樣新的名字與原來(lái)的名字相比,就更能表達(dá)出想要表達(dá)的意思。

在實(shí)際項(xiàng)目中,為了方便,可能很多數(shù)據(jù)類型(尤其是結(jié)構(gòu)體之類的自定義數(shù)據(jù)類型)需要我們重新取一個(gè)適用實(shí)際情況的別名。這時(shí)候typedef 就可以幫助我們。例如:
typedef struct student
{
? ?//code
}Stu_st,*Stu_pst;//命名規(guī)則請(qǐng)參考本章前面部分

A),struct student stu1;和Stu_st stu1;沒(méi)有區(qū)別。
B),struct student *stu2;和Stu_pst stu2;和Stu_st *stu2;沒(méi)有區(qū)別。

這個(gè)地方很多初學(xué)者迷惑,B)的兩個(gè)定義為什么相等呢?其實(shí)很好理解。我們把“struct student { /*code*/}”看成一個(gè)整體,typedef 就是給“struct student {/*code*/}”取了個(gè)別名叫“Stu_st”;同時(shí)給“struct student { /*code*/} *”取了個(gè)別名叫“Stu_pst”。只不過(guò)這兩個(gè)名字同時(shí)取而已,好比你給你家小狗取了個(gè)別名叫“大黃”,同時(shí)你妹妹給小狗帶了小帽子,然后給它取了個(gè)別名叫“小可愛(ài)”。^_^。

好,下面再把typedef 與const 放在一起看看:
C),const Stu_pst stu3;
D),Stu_pst const stu4;

大多數(shù)初學(xué)者認(rèn)為C)里const 修飾的是stu3 指向的對(duì)象;D)里const 修飾的是stu4這個(gè)指針。很遺憾,C)里const 修飾的并不是stu3 指向的對(duì)象。那const 這時(shí)候到底修飾的是什么呢?我們?cè)谥v解const int i 的時(shí)候說(shuō)過(guò)const 放在類型名“int”前后都行;而const int?*p 與int * const p 則完全不一樣。 也就是說(shuō),我們看const 修飾誰(shuí)都時(shí)候完全可以將數(shù)據(jù)類型名視而不見(jiàn),當(dāng)它不存在。反過(guò)來(lái)再看“const Stu_pst stu3”,Stu_pst 是“struct student?{ /*code*/} *”的別名, “struct student {/*code*/} *”是一個(gè)整體。 對(duì)于編譯器來(lái)說(shuō),只認(rèn)為Stu_pst 是一個(gè)類型名,所以在解析的時(shí)候很自然的把“Stu_pst”這個(gè)數(shù)據(jù)類型名忽略掉。

現(xiàn)在知道const 到底修飾的是什么了吧?^_^。

二、typedef 與#define 的區(qū)別

噢,上帝!這真要命!別急,要命的還在后面呢。看如下例子:
E) #define INT32 int
? ? ? ?unsigned INT32 i = 10;
F)typedef int int32;
? ? ? unsigned int32 j = 10;

其中F)編譯出錯(cuò),為什么呢?E)不會(huì)出錯(cuò),這很好理解, 因?yàn)樵陬A(yù)編譯的時(shí)候INT32被替換為int,而unsigned int i = 10;語(yǔ)句是正確的。但是,很可惜,用typedef 取的別名不支持這種類型擴(kuò)展。另外,想想typedef static int int32 行不行?為什么?

下面再看一個(gè)與#define 宏有關(guān)的例子:
G) ?#define PCHAR char*
? ? ? PCHAR p3,p4;
H)typedef char* pchar;
? ? ? ?pchar p1,p2;

兩組代碼編譯都沒(méi)有問(wèn)題, 但是,這里的p4 卻不是指針,僅僅是一個(gè)char 類型的字符。這種錯(cuò)誤很容易被忽略,所以用#define 的時(shí)候要慎之又慎。關(guān)于#define 當(dāng)然還有很多話題需要討論,請(qǐng)看預(yù)處理那一章。當(dāng)然關(guān)于typedef 的討論也還沒(méi)有結(jié)束,在指針與數(shù)組那一章,我們還要繼續(xù)討論。

三、#define a int[10]與typedef int a[10];

留兩個(gè)問(wèn)題:

1)#define a int[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;

2) typedef int a[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;

3) #define a int*[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;

4) ? typedef int * a[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;

5) #define *a int[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;

6) ? typedef int (* a)[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;

7) #define *a * int[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;

8) ?typedef int * (* a)[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;

請(qǐng)判斷這里面哪些定義正確,哪些定義不正確。另外,int[10]和a[10]到底該怎么用?

總結(jié)

以上是生活随笔為你收集整理的C语言typedef关键字—伟大的缝纫师的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。