你能回答下面的問題嗎?
這段**
typedef (int*) pint;
pint a,b;
和這段**
#define pint2 int*
pint2 a, b;
的區別是什麼?
如鵬網上很多同學都犯了類似的錯誤,詳見這個帖子:
這道題把c語言中指標以及"typedef "和"#define"的區別這兩個知識點融到了一起。下面分析一下:
1、指標的定義
在c語言中可以如下定義兩個整形變數:
int a;
int b;
也可以如下的簡寫的方式定義兩個整形變數:
int a, b;
同理也可以如下的方式定義兩個字元型變數:
char a, b;
同樣可以如下定義兩個整形指標變數:
int* a;
int* b;
也就有人錯誤的認為也可以如下簡寫的方式定義兩個整形指標變數:
int* a, b;
需要注意:基型別*號識別符號在以逗號分隔的識別符號列表中每個將被用作指標的識別符號前都必須加上解引用操作符*號。所以要用簡寫的方式定義兩個整形指標變數,要用int *a, *b;
而int* a, b;等價於
int* a;
int b;
而int *a, *b;才等價於
int *a;
int *b;
為了防止發生類似錯誤,這裡建議定義指標變數的時候把"*"和變數名寫在一起。
2、巨集展開
c語言中的巨集就是乙個簡單的字串替換,比如下面的語句:
#define my1 3+2
int i = my1 * 6;
最後i的值等於3+2*6,而不是(3+2)*6。因為編譯器只會將my1簡單的替換為3+2,並不會是大家想像的那樣加上括號。
上面這個道理很多同學都明白,那麼下面這個語句也就不難理解了:
#define pint2 int*
pint2 a, b;
編譯器只會把巨集pint2簡單的替換成int*,所以替換後的**是:
int* a, b;
由上面的分析我們得知這句**的意思是:宣告整形指標變數a和整形變數b。
3、typedef型別別名定義
c語言中可以使用typedef為型別指定別名,比如:
typedef int myint;
就是為int指定乙個別名myint,以後所有用int定義變數的地方都可以使用myint。
同樣可以為指標型別指定別名,比如:
typedef int* pmyint;
那麼以後就可以如下定義整形變數指標:
pmyint a;
pmyint b;
那麼下面這句是什麼意思呢?
pmyint a, b;
這句話的意思就是定義兩個整形變數指標a和b,因為pmyint是一種型別(int *)的別名,也就是說pmyint是一種型別。等價於:
int* a;
int* b;
總結:用巨集和typedef雖然都可以達到定義型別別名的效果,但是由於巨集定義的方式很容易出錯,既然c語言有專門的定義型別別名的關鍵字typedef,所以定義別名最好使用typedef。
文章出處:http://www.rupeng.com/forum/thread-279-1-1-uid263.html
C語言中的typedef跟define的區別
今天用c語言練習時涉及到了typedef和define的使用問題,那麼他們的區別是啥?這種情況下為什麼要用typedef?哪種情況下為什麼要用define呢?學習c的時候的你是否考慮過這個問題呢?今天我決定梳理一下,以備後用。相同點 1 都可以給變數起別名 不同點 1 define定義後可以擴充套件...
Typedef和define的區別
typedef和define都可以用來給物件取乙個別名,但是兩者卻有著很大不同。1 首先,二者執行時間不同 關鍵字typedef在編譯階段有效,由於是在編譯階段,因此typedef有型別檢查的功能。define則是巨集定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字串替換,而不進行任何...
typedef和 define的區別
一 typedef的用法 二 define的用法 define為一巨集定義語句,通常用它來定義常量 包括無參量與帶參量 以及用來實現那些 表面似和善 背後一長串 的巨集,它本身並不在編 譯過程中進行,而是在這之前 預處理過程 就已經完成了,但也因此難以發現潛在的錯誤及其它 維護問題,define的用...