C語言丨區別 typedef與#define的用法,一文搞懂關鍵字typedef


在C語言中有一個typedef關鍵字,其用來定義用戶自定義類型。當然,並不是真的創造了一種數據類型,而是給已有的或者符合型的以及復雜的數據類型取一個我們自己更容易理解的別名。總之,可以使用typedef關鍵字定義一個我們自己的類型名稱。它本身是一種存儲類的關鍵字,與auto、extern、mutable、staTIc、register等關鍵字不能出現在同一個表達式中。

那么,究竟如何定義,又有哪些情況下可已使用呢?接下來我們就對它的幾種用法進行說明:

C語言中typedef的用法

1.基本數據類型定義

       例如:typedef unsigned char uchar

  描述:uchar等價於unsigned char類型定義 uchar c聲明等於unsigned char c聲明

2.數組類型定義

  例如: typedef int array[2];

  描述: array等價於 int [2]定義; array a聲明等價於int a[2]聲明

  擴展: typedef int array[M][N];

  描述: array等價於 int [M][N]定義; array a聲明等價於int a[M][N]聲明

3.指針類型定義

  例如: typedef int *pointer;

  描述: pointer等價於 int *定義;pointer p聲明等價於int *a聲明

  例如: typedef int *pointer[M];

  描述: pointer等價於 int *[M]定義 pointer p聲明等價於int *a[M]聲明

4.函數地址說明

  描述:C把函數名字當做函數的首地址來對待,我們可以使用最簡單的方法得到函數地址

  例如: 函數:int func(void); unsigned long funcAddr=(unsigned long)func, funcAddr的值是func函數的首地址

5.函數聲明

  例如: typedef int func(void); func等價於 int (void)類型函數

  描述1: func f聲明等價於 int f(void)聲明,用於文件的函數聲明

  描述2: func *pf聲明等價於 int (*pf)(void)聲明,用於函數指針的生命,見下一條

6.函數指針

  例如: typedef int (*func)(void)

  描述: func等價於int (*)(void)類型

  func pf等價於int (*pf)(void)聲明,pf是一個函數指針變量

 typedef關鍵字與#define宏定義的區別

 #define 是 C 指令,用於為各種數據類型定義別名,與 typedef 類似,但是它們有以下幾點不同:

  1.從功能范圍上講,Typedef用來定義類型的別名,這些類型不只包含內部類型(int,char等),還包括自定義類型(如struct),可以起到使類型易於記憶的功能。它還有另外一個重要的用途,那就是定義機器無關的類型 。#define不只是可以為類型取別名,還可以定義常量、變量、編譯開關等。

typedef主要是為已存在的關鍵字或類型及其組合取一個我們容易識別的別名。在這一點上#define也可實現,但初次之外#define還有很多其它用處,如果願意你可以使用它定義任何代碼,這時typedef所不具備的。

  2.從執行時間上講,對於#define定義的宏,其在預處理階段就會被替換。而typedef定義的類型會在編譯時處理。

  3.從作用於上來講,一般來說#define定義的宏沒有作用域的限制,只要在使用前有定義就可以了。而typedef定義的別名是有作用域的。

  4.從實現效果來講,我們使用typedef定義一個指針類型,然后使用該類型可以同時聲明對各變量,而#define卻不是這樣的。如typedef (int*) pType;可以使用pType a,b;這里a和b都是指向整數的指針變量。但我們同樣定義#define pType int*,若使用pType a,b;定義a和b,則a是指向整數的指針變量,而b不是。

總結:結合上文,不難看出,在對數據類型名進行自定義時,采用typedef更為保險,當然也非一成不變的規律,主要是理解二者的區別,依情況選用。

識別typedef的方法

  a)、第一步,使用已知的類型定義替代typdef后面的名稱,直到只剩下一個名字不識別為正確;

  b)、第二步,未知名字為定義類型,類型為取出名稱和typedef的所有部分;

  c)、第三步,定義一個變量時,變量類型等價於把變量替代未知名字的位置所得到的類型。


 

如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!

C語言C++學習企鵝圈子】,分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)

歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!

編程學習書籍:


 

編程學習視頻:


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM