C語言中typedef的用法以及#define區別詳解

1、簡潔定義

C語言允許為一個數據類型起一個新的別名,就像給人起“綽號”一樣。而編程中起別名,是為瞭編程人員編程方便,例如:

定義如下結構體

struct stu
{
	int ID;
	char name[20];
	float score[3];
	char *data;
};

要想定義一個結構體變量就得這樣寫:

struct stu Marry;//Marry是定義的新結構體學生

這個地方可以用我們今天的主題語法:typedef,來減少定義時需要的字符,來完成目的,如下:

typedef struct stu
{
	int ID;
	char name[20];
	float score[3];
	char *data;
}STU;
//定義一個Marry學生結構體
STU Marry;

可以看到非常簡單的定義字符,完成結構體定義,另外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 還可以給數組、指針、結構體等類型定義別名。先來看一個給數組類型定義別名的例子:

為字符數組起別名

typedef char ARRAY20[20];

表示 ARRAY20 是類型char [20]的別名。它是一個長度為 20 的數組類型。接著可以用 ARRAY20 定義數組:

ARRAY20 a1, a2, s1, s2;

結果如下,可以看到ARRAY20 定義的數組長度是20個字符。

因此 ARRAY20 a1, a2, s1, s2; 等價於 char a1[20], a2[20], s1[20], s2[20]; ,即數組也是有類型的,例如char a1[20];定義瞭一個數組 a1,它的類型就是 char [20]。

為指針起別名

為指針類型定義別名,例如如下:

typedef int (*ptr_to_arr)[4];

表示 ptr_to_arr是類型int * [4]的別名,它是一個二維數組指針類型。接著可以使用 ptr_to_arr定義二維數組指針:

ptr_to_arr p1, p2;

這代表p1, p2都是二維數組指針,同樣也可以為函數指針類型定義別名:

typedef int (*ptr_to_func)(int, int);
ptr_to_func pfunc;

如下表示為指針類型和函數類型起別名:

#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 代表一個二維數組指針,指向str這個二維數組對應元素
    ptr_to_func  pfunc = max;//pfunc代表一個函數指針,指向max函數
    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;
}

結果如下:

需要強調的是,typedef 是賦予現有類型一個新的名字,而不是創建新的類型。為瞭“見名知意”,請盡量使用含義明確的標識符,並且盡量大寫。

3、typedef 和 #define 的區別

typedef 在表現上有時候類似於 #define,但它和宏替換之間存在一個關鍵性的區別。正確思考這個問題的方法就是把 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)在連續定義幾個變量的時候,typedef 能夠保證定義的所有變量均為同一類型,而 #define 則無法保證。例如:

#define My_int int *
My_int p1, p2;

//如果用宏替換則變為:

int *p1, p2;

這樣會使, p1、p2 成為不同的類型,p1為指向int類型的指針,p2為int類型數據。

對於typedef定義的別名,不存在上述的情況,例如:

typedef int * PTR_INT
PTR_INT p1, p2;

p1、p2 類型相同,它們都是指向 int 類型的指針。

總結

到此這篇關於C語言中typedef的用法以及#define區別的文章就介紹到這瞭,更多相關C語言typedef及#define區別內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: