C語言中typedef的用法以及#define區(qū)別詳解
1、簡潔定義
C語言允許為一個數(shù)據(jù)類型起一個新的別名,就像給人起“綽號”一樣。而編程中起別名,是為了編程人員編程方便,例如:
定義如下結(jié)構(gòu)體
struct stu
{
int ID;
char name[20];
float score[3];
char *data;
};
要想定義一個結(jié)構(gòu)體變量就得這樣寫:
struct stu Marry;//Marry是定義的新結(jié)構(gòu)體學(xué)生
這個地方可以用我們今天的主題語法:typedef,來減少定義時需要的字符,來完成目的,如下:
typedef struct stu
{
int ID;
char name[20];
float score[3];
char *data;
}STU;
//定義一個Marry學(xué)生結(jié)構(gòu)體
STU Marry;
可以看到非常簡單的定義字符,完成結(jié)構(gòu)體定義,另外typedef也可以用于已有類型,為已有類型起一個新的名字。
2、為已有類型起別名
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)體等類型定義別名。先來看一個給數(shù)組類型定義別名的例子:
為字符數(shù)組起別名
typedef char ARRAY20[20];
表示 ARRAY20 是類型char [20]的別名。它是一個長度為 20 的數(shù)組類型。接著可以用 ARRAY20 定義數(shù)組:
ARRAY20 a1, a2, s1, s2;
結(jié)果如下,可以看到ARRAY20 定義的數(shù)組長度是20個字符。

因此 ARRAY20 a1, a2, s1, s2; 等價于 char a1[20], a2[20], s1[20], s2[20]; ,即數(shù)組也是有類型的,例如char a1[20];定義了一個數(shù)組 a1,它的類型就是 char [20]。
為指針起別名
為指針類型定義別名,例如如下:
typedef int (*ptr_to_arr)[4];
表示 ptr_to_arr是類型int * [4]的別名,它是一個二維數(shù)組指針類型。接著可以使用 ptr_to_arr定義二維數(shù)組指針:
ptr_to_arr p1, p2;
這代表p1, p2都是二維數(shù)組指針,同樣也可以為函數(shù)指針類型定義別名:
typedef int (*ptr_to_func)(int, int); ptr_to_func pfunc;
如下表示為指針類型和函數(shù)類型起別名:
#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 代表一個二維數(shù)組指針,指向str這個二維數(shù)組對應(yīng)元素
ptr_to_func pfunc = max;//pfunc代表一個函數(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é)果如下:

需要強調(diào)的是,typedef 是賦予現(xiàn)有類型一個新的名字,而不是創(chuàng)建新的類型。為了“見名知意”,請盡量使用含義明確的標識符,并且盡量大寫。
3、typedef 和 #define 的區(qū)別
typedef 在表現(xiàn)上有時候類似于 #define,但它和宏替換之間存在一個關(guān)鍵性的區(qū)別。正確思考這個問題的方法就是把 typedef 看成一種徹底的“封裝”類型,聲明之后不能再往里面增加別的東西。例如如下情況:
1)能否使用其他類型說明符對宏類型名進行擴展
用unsigned 配合 #define定義的變量,可以使用:
#define MY_int int unsigned MY_int n; //沒問題
但是用unsigned 配合 typedef 定義的變量,則不可以使用:
typedef int MY_int ; unsigned MY_int n; //錯誤,不能在 MY_int 前面添加 unsigned
表明了typedef 的完整性。
2)在連續(xù)定義幾個變量的時候,typedef 能夠保證定義的所有變量均為同一類型,而 #define 則無法保證。例如:
#define My_int int * My_int p1, p2;
//如果用宏替換則變?yōu)椋?/p>
int *p1, p2;
這樣會使, p1、p2 成為不同的類型,p1為指向int類型的指針,p2為int類型數(shù)據(jù)。
對于typedef定義的別名,不存在上述的情況,例如:
typedef int * PTR_INT PTR_INT p1, p2;
p1、p2 類型相同,它們都是指向 int 類型的指針。
總結(jié)
到此這篇關(guān)于C語言中typedef的用法以及#define區(qū)別的文章就介紹到這了,更多相關(guān)C語言typedef及#define區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++的STL中accumulate函數(shù)的使用方法
這篇文章主要介紹了C++的STL中accumulate的使用方法,accumulate作用是累加求和即自定義類型數(shù)據(jù)處理,下文具體的操作方法需要的小伙伴可以參考一下2022-03-03
C++/Php/Python/Shell 程序按行讀取文件或者控制臺的實現(xiàn)
下面小編就為大家?guī)硪黄狢++/Php/Python/Shell 程序按行讀取文件或者控制臺的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
C++二維數(shù)組中數(shù)組元素存儲地址的計算疑問講解
今天小編就為大家分享一篇關(guān)于C++二維數(shù)組中數(shù)組元素存儲地址的計算疑問講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02

