溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C語(yǔ)言中typedef怎么用

發(fā)布時(shí)間:2021-07-06 14:22:16 來(lái)源:億速云 閱讀:138 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了C語(yǔ)言中typedef怎么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    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è)字符。

    C語(yǔ)言中typedef怎么用

    因此 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é)果如下:

    C語(yǔ)言中typedef怎么用

    需要強(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)型的指針。

    感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C語(yǔ)言中typedef怎么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI