兩者的區別:
1) #define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。例如:
#define pi 3.1415926
程式中的:area=pi*r*r 會替換為3.1415926*r*r
如果你把#define語句中的數字9 寫成字母g 預處理也照樣帶入。
2)typedef是在編譯時處理的。它在自己的作用域內給乙個已經存在的型別乙個別名,但是you cannot use the typedef specifier inside a function definition。
3)typedef int * int_ptr; 與 #define int_ptr int * 作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說 ,#define在預處理 時進行簡單的替換,而typedef不是簡單替換 ,而是採用如同定義變數的方法那樣來宣告一種型別。也就是說;
#define int_ptr int *
int_ptr a, b; //相當於int * a, b; 只是簡單的巨集替換
typedef int* int_ptr;
int_ptr a, b; //a, b 都為指向int的指標,typedef為int* 引入了乙個新的助記符
這也說明了為什麼下面觀點成立
typedef int * pint ;
#define pint int *
那麼:
const pint p ;//p不可更改,但p指向的內容可更改
const pint p ;//p可更改,但是p指向的內容不可更改。
pint是一種指標型別 const pint p 就是把指標給鎖住了 p不可更改
而const pint p 是const int * p 鎖的是指標p所指的物件。
3)#define 不是語句 不要在行末加分號,否則 會連分號一塊置換。
typedef的用法:
#include
#include
/* 避免
visual c
的for
與標準for
的不同*/
#definefor
if(0);
elsefor
/* dim(a)
是用於計算
a的維數,不過只能計算陣列的維數,不能計算指標的維數
*/#definedim(a) (sizeof(a)/sizeof(a[0]))
/* n1到n4
是幾個常量,以列舉的形式定義
*/
enum;
/* 這個
c程式設計師都知道,就是將
datatype
定義為int
型,便於擴充
*/
typedefintdatatype;
/* 定義乙個一維陣列,陣列的元素維整型值
*/
typedefdatatype arr1[n4];
/* 再定義乙個一維陣列,陣列的元素維
arr1
型,不過
arr1
又是乙個陣列,所以
* arr2
實際上是乙個矩陣 */
typedefarr1 arr2[n3];
/* 此處完全等價為
typedef int arr2[n3][n4];*/
/* 按照arr2
的解釋,
arr3
也是乙個一維陣列,不過陣列元素的型別是
arr2
的型別
* 所有
arr3
是乙個三維陣列 */
typedefarr2 arr3[n2];
/* 此處完全等價為
typedef int arr3[n2][n3][n4];*/
/* 分別用定義好的
arr1
,arr2
,arr3
定義三個變數
a, b, c */
arr1 a;
/* 此處完全等價於:
int a[n4]; */
arr2 b;
/* 此處完全等價於:
int b[n3][n4]; */
arr3 c;
/* 此處完全等價於:
int c[n2][n3][n4]; */
/* 下面函式給大家個示例看
a,b,c
如何使用
*/
voidexam_1()
printf("/nthe c is:/n");
for(inti=0; i
printf("/n");}}
/* 下面函式給大家演示陣列在記憶體中的排列
*/
voidexam_2()
intmain(intargc,char* argv)
C語言中typedef的用法和 define區別
typedef 型別定義 typedef 是給各種資料型別定義新名字,主要是用來簡潔的表示一些複雜的資料型別,比如說指向其他物件指標之類 defined也有這個意思,但是define巨集只是進行一種簡單的替換。普通的變數宣告方式,比如 宣告乙個字元型變數 char c 宣告乙個字元型指標變數為 ch...
糾結的const(static) 和 define
const static 和 define 在開發中常用來定義常量,這樣做的好處是 使 更易維護 提高 的效率。1 const static const是c c 中的乙個關鍵字 修飾符 const一般用來定義乙個常量,既然叫做常量,即以後再也不能修改其值。const 定義常量時,編譯器通常不為普通c...
關於typedef的用法
在計算機程式語言中用來為複雜的宣告定義簡單的別名,與巨集定義有些差異。它本身是一種儲存類的關鍵字,與auto extern mutable static register等關鍵字不能出現在同乙個表示式中。typedef宣告,簡稱typedef,為現有型別建立乙個新的名字,或稱為型別別名,在 結構體定...