C語言typedef關鍵字—偉大的縫紉師

關于馬甲的笑話。有這樣一個笑話:一個獵人在河邊抓捕一條蛇,蛇逃進了水里。過一會,一個烏龜爬到岸邊。獵人一把抓住這個烏龜,大聲的說道:小樣,別你為你穿了個馬甲我就不認識你了!

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

一、歷史的誤會——也許應該是typerename。

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

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

A),struct student stu1;和Stu_st stu1;沒有區別。
B),struct student *stu2;和Stu_pst stu2;和Stu_st *stu2;沒有區別。

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

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

大多數初學者認為C)里const 修飾的是stu3 指向的對象;D)里const 修飾的是stu4這個指針。很遺憾,C)里const 修飾的并不是stu3 指向的對象。那const 這時候到底修飾的是什么呢?我們在講解const int i 的時候說過const 放在類型名“int”前后都行;而const int?*p 與int * const p 則完全不一樣。 也就是說,我們看const 修飾誰都時候完全可以將數據類型名視而不見,當它不存在。反過來再看“const Stu_pst stu3”,Stu_pst 是“struct student?{ /*code*/} *”的別名, “struct student {/*code*/} *”是一個整體。 對于編譯器來說,只認為Stu_pst 是一個類型名,所以在解析的時候很自然的把“Stu_pst”這個數據類型名忽略掉。

現在知道const 到底修飾的是什么了吧?^_^。

二、typedef 與#define 的區別

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

其中F)編譯出錯,為什么呢?E)不會出錯,這很好理解, 因為在預編譯的時候INT32被替換為int,而unsigned int i = 10;語句是正確的。但是,很可惜,用typedef 取的別名不支持這種類型擴展。另外,想想typedef static int int32 行不行?為什么?

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

兩組代碼編譯都沒有問題, 但是,這里的p4 卻不是指針,僅僅是一個char 類型的字符。這種錯誤很容易被忽略,所以用#define 的時候要慎之又慎。關于#define 當然還有很多話題需要討論,請看預處理那一章。當然關于typedef 的討論也還沒有結束,在指針與數組那一章,我們還要繼續討論。

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

留兩個問題:

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;

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450523.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

將網橋的配置寫進去/etc/sysconfig/network-scripts/ifcfg-xxx

有時候需要使用網橋命令比如brctl設置一些網橋的屬性,而這些方式能否同樣寫進去配置文件使其永久開機生效。 答案是不行的,也同樣找過Ubuntu的,其實Ubuntu可以實現,參考:http://manpages.ubuntu.com/manpages/cosmic/m…

phpstorm如何回滾。并取消本地提交

1、現在我提交到本地 當前git版本為4b53dca9 上一版本為965cdf14 2、現在執行回滾操作,取消本地提交 版本復制到這里,點擊reset就會回滾了 如需使用git命令操作,請參考鏈接https://blog.csdn.net/qq_35774849/article/details/107313193

windows server 2008 R2 x64 基礎知識(2)

一、防火墻設置 1.windows防火墻的種類: 1)工作組網絡環境 2)域網絡環境 2.防火墻的配置 1)打開管理工具:win->管理工具->高級安全windows防火墻 2)管理配置: (1)防火墻的數據流類型 a.入站流量:外部訪問內部分流量 b…

SOA 說明,解析

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一直對SOA這個概念不甚明了,再度記錄下: 一、是一個面向服務的架構,是一種思想、規則。而不是一個確…

Windows API 第二篇 SHGetSpecialFolderPath

BOOL SHGetSpecialFolderPath( HWND hwndOwner, LPTSTR lpszPath, int nFolder, BOOL fCreate ); 參數解釋: hwndOwner:Handle to the owner wind…

面向對象—的__new__()方法詳解

[Python] Python 之 __new__() 方法與實例化 __new__() 是在新式類中新出現的方法,它作用在構造方法建造實例之前,可以這么理解,在 Python 中存在于類里面的構造方法 __init__() 負責將類的實例化,而在 __init__() 啟動之前&#…

git使用回滾,清除暫緩區,解決沖突(持續更新)

1、git restore --staged <文件> 清除暫緩區文件名 2、git reset --hard <版本號> 回滾到上一版本 如看PHPstrom如何操作請參考https://blog.csdn.net/qq_35774849/article/details/107312658 3、解決沖突 &#xff08;1&#xff09;使用默認的解決沖突 打開…

14.安全

1.基本概念 安全問題的產生&#xff1a; 互聯網作為商業交易的工具快速發展&#xff0c;越來越多的公司提供網絡交易服務。很多商業活動在網上進行當前&#xff0c;成千上萬的網民在網上進行各種活動的同時&#xff0c;也在網上傳遞其個人信息每天在網上發生各種各樣的商業活動…

C語言enum關鍵字

很多初學者對枚舉(enum)感到迷惑&#xff0c;或者認為沒什么用&#xff0c;其實枚舉(enum)是個很有用的數據類型。一、枚舉類型的使用方法 一般的定義方式如下&#xff1a;enum enum_type_name{ENUM_CONST_1,ENUM_CONST_2,...ENUM_CONST_n} enum_variable_name;注意&#xff1a…

Dubbo 需求、架構、使用Demo

只是整理下方便自己記錄 內容全部來自官網&#xff1a;http://dubbo.io/books/dubbo-user-book/preface/usage.html 一、需求 在大規模服務化之前&#xff0c;應用可能只是通過 RMI 或 Hessian 等工具&#xff0c;簡單的暴露和引用遠程服務&#xff0c;通過配置服務的URL地址進…

Ubuntu安裝之python開發

Ubuntu安裝之python開發 什么&#xff1f;&#xff1f;Ubuntu(烏班圖)開發&#xff1f;不會用&#xff1f;&#xff1f;怎么進行python開發&#xff1f;&#xff1f;&#xff1f; 烏班圖操作系統下載地址&#xff1a;http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-…

vimdiff和vim-fugitive安裝,使用教程

1、vimdiff的安裝 在終端執行 git config --global merge.tool vimdiff git config --global merge.conflictstyle diff3 git config --global mergetool.prompt false git config --global diff.tool vimdiff git config --global difftool.prompt false git config --…

在 PowerPoint 2016 中嵌入網頁

之前在智圖這個網站上做了一張地圖&#xff0c;在嵌入 PPT 里面的時候碰到了一些問題&#xff0c;現在把找到的解決方法寫下來。 PPT 里面自帶的 WebBrowser 控件可以實現網頁瀏覽的功能。在“開發工具”選項卡下的“其他控件”中找到“Microsoft Web Browser”&#xff0c;在畫…

js 正則表達式 整合

正則表達式:斷言 取字符串區間: /(?<[" star "]).*(?[" end "])/// 簡單封裝 Vue.prototype.strMatch (str,star,end) > { let regs new RegExp("(?<[" star "]).*(?[" end "])"); let req str…

dubbo 注冊中心zookeeper 手冊

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 zookeeper 注冊中心 Zookeeper 是 Apacahe Hadoop 的子項目&#xff0c;是一個樹型的目錄服務&#xff0c;支持變更推送&#xff0c;適…

數組 深入詳解

再論C語言數組 C語言處理數組的方式是它廣受歡迎的原因之一。C語言對數組的處理是非常有效的&#xff0c;其原因有以下三點&#xff1a;第一&#xff0c;除少數翻譯器出于謹慎會作一些繁瑣的規定外&#xff0c;C語言的數組下標是在一個很低的層次上處理的。但這個優點也有一個反…

oracle ins-30131錯誤

打開cmd 但是在我的環境沒效果&#xff0c;而我已知臨時目錄沒有問題。那么在命令行進入安裝軟件目錄&#xff0c;通過命令行啟動安裝程序&#xff0c;設置 ignorePrereq 檢查&#xff0c;此時數據庫軟件可以啟動安裝&#xff0c;是否會出現錯誤&#xff0c;就看忽略的檢查是否…

iOS開發UI篇—簡單介紹靜態單元格的使用

一、實現效果與說明 說明&#xff1a;觀察上面的展示效果&#xff0c;可以發現整個界面是由一個tableview來展示的&#xff0c;上面的數據都是固定的&#xff0c;且幾乎不會改變。 要完成上面的效果&#xff0c;有幾種方法&#xff1a; &#xff08;1&#xff09;可以直接利用代…

展示內容

今天課上展示了軟件 評價為過于簡單 還需另尋他法轉載于:https://www.cnblogs.com/wmqlzm/p/10041683.html

dubbo ,dubbo-provider、dubbo-consumer 配置參數說明

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 dubbo:consumer 服務消費者缺省值配置。配置類&#xff1a; com.alibaba.dubbo.config.ConsumerConfig 。同時該標簽為 <dubbo:refer…