C語(yǔ)言中typedef的用法以及#define區(qū)別詳解
1、簡(jiǎn)潔定義
C語(yǔ)言允許為一個(gè)數(shù)據(jù)類(lèi)型起一個(gè)新的別名,就像給人起“綽號(hào)”一樣。而編程中起別名,是為了編程人員編程方便,例如:
定義如下結(jié)構(gòu)體
struct stu { int ID; char name[20]; float score[3]; char *data; };
要想定義一個(gè)結(jié)構(gòu)體變量就得這樣寫(xiě):
struct stu Marry;//Marry是定義的新結(jié)構(gòu)體學(xué)生
這個(gè)地方可以用我們今天的主題語(yǔ)法:typedef,來(lái)減少定義時(shí)需要的字符,來(lái)完成目的,如下:
typedef struct stu { int ID; char name[20]; float score[3]; char *data; }STU; //定義一個(gè)Marry學(xué)生結(jié)構(gòu)體 STU Marry;
可以看到非常簡(jiǎn)單的定義字符,完成結(jié)構(gòu)體定義,另外typedef也可以用于已有類(lèi)型,為已有類(lèi)型起一個(gè)新的名字。
2、為已有類(lèi)型起別名
typedef 的用法一般為:
typedef oldName newName;
例如如下,為int起名 Integer:
typedef int MY_int; MY_int a, b; a = 1; b = 2; /*這里 MY_int a, b ;等同于 int a, b; */
這里 MY_int a, b ; 等同于 int a, b;
typedef 還可以給數(shù)組、指針、結(jié)構(gòu)體等類(lèi)型定義別名。先來(lái)看一個(gè)給數(shù)組類(lèi)型定義別名的例子:
為字符數(shù)組起別名
typedef char ARRAY20[20];
表示 ARRAY20 是類(lèi)型char [20]的別名。它是一個(gè)長(zhǎng)度為 20 的數(shù)組類(lèi)型。接著可以用 ARRAY20 定義數(shù)組:
ARRAY20 a1, a2, s1, s2;
結(jié)果如下,可以看到ARRAY20 定義的數(shù)組長(zhǎng)度是20個(gè)字符。
因此 ARRAY20 a1, a2, s1, s2; 等價(jià)于 char a1[20], a2[20], s1[20], s2[20]; ,即數(shù)組也是有類(lèi)型的,例如char a1[20];定義了一個(gè)數(shù)組 a1,它的類(lèi)型就是 char [20]。
為指針起別名
為指針類(lèi)型定義別名,例如如下:
typedef int (*ptr_to_arr)[4];
表示 ptr_to_arr是類(lèi)型int * [4]的別名,它是一個(gè)二維數(shù)組指針類(lèi)型。接著可以使用 ptr_to_arr定義二維數(shù)組指針:
ptr_to_arr p1, p2;
這代表p1, p2都是二維數(shù)組指針,同樣也可以為函數(shù)指針類(lèi)型定義別名:
typedef int (*ptr_to_func)(int, int); ptr_to_func pfunc;
如下表示為指針類(lèi)型和函數(shù)類(lèi)型起別名:
#include <stdio.h> typedef char (*ptr_to_arr )[30]; typedef int (*ptr_to_func )(int, int); int max(int a, int b){ return a>b ? a : b; } char str[3][30] = { "Happy New Year", "Good Good Study", "Day Day up" }; int main(){ ptr_to_arr parr = str;//parr 代表一個(gè)二維數(shù)組指針,指向str這個(gè)二維數(shù)組對(duì)應(yīng)元素 ptr_to_func pfunc = max;//pfunc代表一個(gè)函數(shù)指針,指向max函數(shù) int i; printf("max: %d\n", (*pfunc)(10, 20)); for(i=0; i<3; i++){ printf("str[%d]: %s\n", i, *(parr+i)); } return 0; }
結(jié)果如下:
需要強(qiáng)調(diào)的是,typedef 是賦予現(xiàn)有類(lèi)型一個(gè)新的名字,而不是創(chuàng)建新的類(lèi)型。為了“見(jiàn)名知意”,請(qǐng)盡量使用含義明確的標(biāo)識(shí)符,并且盡量大寫(xiě)。
3、typedef 和 #define 的區(qū)別
typedef 在表現(xiàn)上有時(shí)候類(lèi)似于 #define,但它和宏替換之間存在一個(gè)關(guān)鍵性的區(qū)別。正確思考這個(gè)問(wèn)題的方法就是把 typedef 看成一種徹底的“封裝”類(lèi)型,聲明之后不能再往里面增加別的東西。例如如下情況:
1)能否使用其他類(lèi)型說(shuō)明符對(duì)宏類(lèi)型名進(jìn)行擴(kuò)展
用unsigned 配合 #define定義的變量,可以使用:
#define MY_int int unsigned MY_int n; //沒(méi)問(wèn)題
但是用unsigned 配合 typedef 定義的變量,則不可以使用:
typedef int MY_int ; unsigned MY_int n; //錯(cuò)誤,不能在 MY_int 前面添加 unsigned
表明了typedef 的完整性。
2)在連續(xù)定義幾個(gè)變量的時(shí)候,typedef 能夠保證定義的所有變量均為同一類(lèi)型,而 #define 則無(wú)法保證。例如:
#define My_int int * My_int p1, p2;
//如果用宏替換則變?yōu)椋?/p>
int *p1, p2;
這樣會(huì)使, p1、p2 成為不同的類(lèi)型,p1為指向int類(lèi)型的指針,p2為int類(lèi)型數(shù)據(jù)。
對(duì)于typedef定義的別名,不存在上述的情況,例如:
typedef int * PTR_INT PTR_INT p1, p2;
p1、p2 類(lèi)型相同,它們都是指向 int 類(lèi)型的指針。
總結(jié)
到此這篇關(guān)于C語(yǔ)言中typedef的用法以及#define區(qū)別的文章就介紹到這了,更多相關(guān)C語(yǔ)言typedef及#define區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解C語(yǔ)言中typedef和#define的用法與區(qū)別
- C語(yǔ)言中#define與typedef的互換細(xì)節(jié)詳解
- C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)解析(extern,static,typedef,const)
- C語(yǔ)言?typedef的用法示例詳解
- C語(yǔ)言之結(jié)構(gòu)體定義 typedef struct 用法詳解和用法小結(jié)
- C語(yǔ)言 typedef:給類(lèi)型起一個(gè)別名
- C語(yǔ)言typedef與復(fù)雜函數(shù)聲明問(wèn)題的深入解析
- C語(yǔ)言中的typedef、#define、const特點(diǎn)和用法介紹
相關(guān)文章
JS調(diào)用C++函數(shù)拋出異常及捕捉異常詳解
這篇文章主要介紹了js調(diào)用C++函數(shù)的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-08-08運(yùn)用指針在不用加號(hào)的情況進(jìn)行加法運(yùn)算的講解
今天小編就為大家分享一篇關(guān)于運(yùn)用指針在不用加號(hào)的情況進(jìn)行加法運(yùn)算的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01Visual Studio Code 從簡(jiǎn)介、安裝到配置所需插件詳細(xì)介紹
這篇文章給大家介紹到vs與vs code的區(qū)別,并且會(huì)詳細(xì)介紹vscode的安裝步驟,和我所了解過(guò)的插件配置,感興趣的朋友跟隨小編一起看看吧2020-03-03C++基礎(chǔ)入門(mén)教程(七):一些比較特別的基礎(chǔ)語(yǔ)法總結(jié)
這篇文章主要介紹了C++基礎(chǔ)入門(mén)教程(七):一些比較特別的基礎(chǔ)語(yǔ)法總結(jié),本文總結(jié)的都是一些特殊的語(yǔ)法,需要的朋友可以參考下2014-11-11Matlab實(shí)現(xiàn)灰色預(yù)測(cè)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Matlab實(shí)現(xiàn)灰色預(yù)測(cè),文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2022-05-05詳解C語(yǔ)言如何計(jì)算結(jié)構(gòu)體大小(結(jié)構(gòu)體的內(nèi)存對(duì)齊)
結(jié)構(gòu)體的內(nèi)存對(duì)齊是有關(guān)結(jié)構(gòu)體內(nèi)容的很重要一個(gè)知識(shí)點(diǎn),主要考察方式是計(jì)算結(jié)構(gòu)體的字節(jié)大小,所以本文就給大家詳細(xì)介紹一下C語(yǔ)言如何計(jì)算結(jié)構(gòu)體大小,文中的代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07