typedef 機制為我們提供了一種通用的型別定義設施,可以用來為內建的或使用者定義的數
據型別引入助記符號 。
typedef 定義以關鍵字typedef 開始,後面是資料型別和識別符號。這裡的識別符號即typedef
名字,它並沒有引入一種新的型別,而只是為現有型別引入了乙個助記符號。typedef 名字對
以出現在任何型別名能夠出現的地方。
幾個經典的typedef的用法如下。。
1。與機構體
typedef struct tag
*p, node;
此處的node等價於 struct tag, 我們可以用 node來定義變數。值得注意的是這裡我們不能用tag來定義變數。
與上式等價的是
struct tag
;typedef struct tag *p;
2與陣列
/* 定義乙個一維陣列,陣列的元素維整型值*/
typedefintarr1[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]; */
3。與函式
intadd(int,int);
intsub(int,int);
intmul(int,int);
intdiv(int,int);
// 定義指向這類函式的指標
typedefint(*fp_calc)(int,int);
// int(*s_calc_func(charop))(int,int);
// //
定義乙個函式
calc_func
,它根據操作字元
op 返回指向相應的計算函式的指標
fp_calccalc_func(charop);
// 根據op
返回相應的計算結果值
intcalc(inta,intb,charop);
intadd(inta,intb)
intsub(inta,intb)
intmul(inta,intb)
intdiv(inta,intb)
// 這個函式的用途與下乙個函式作業和呼叫方式的完全相同,
// 引數為op
,而不是最後的兩個整形
int(*s_calc_func(charop)) (int,int)
fp_calccalc_func(charop)
returnnull;
}intcalc(inta,intb,charop)
voidtest_fun()
4 typedef & #define區別
下面的**中編譯器會報乙個錯誤,你知道是哪個語句錯了嗎?
typedef char * pstr;
char string[4] = "abc";
const char *p1 = string;
const pstr p2 = string;
p1++;
p2++;
答案與分析:
是p2++出錯了。這個問題再一次提醒我們:typedef和#define不同,它不是簡單的文字替換。上述**中const pstr p2並不等於const char * p2。const pstr p2和const long x本質上沒有區別,都是對變數進行唯讀限制,只不過此處變數p2的資料型別是我們自己定義的而不是系統固有型別而已。因此,const pstr p2的含義是:限定資料型別為char *的變數p2為唯讀,因此p2++錯誤。
#define用法例子:
#define f(x) x*x
main( )
以下程式的輸出結果是: 36。
因為如此原因,在許多c語言程式設計規範中提到使用#define定義時,如果定義中包含表示式,必須使用括號,則上述定義應該如下定義才對:
#define f(x) (x*x)
當然,如果你使用typedef就沒有這樣的問題。
總結一下typedef和 define的區別
1.概念 define 它在編譯預處理時進行簡單的替換,不作正確性檢查。它是預處理指令。typedef 它在自己的作用域內給乙個已經存在的型別乙個別名。它是在是在編譯時處理的。例子 define define do doubledo val 5 相當於 double va 5 define fun ...
紀錄一下react redux的用法
最近學習react,結果碰到了redux這個玩意,琢磨琢磨勉勉強強會用了。紀錄一下,以免以後忘了。首先是專案的根目錄 index.js 引入redux檔案 import from react redux import from redux import reducer from redux redu...
整理一下Promise 的用法
pormise是js的非同步程式設計的一種解決方案,在es6將其寫進了語言標準,提供了原生的promise物件。promise簡單來理解就是乙個容器,裡面存放著某個未來才會結束的事件結果。promise是乙個物件,從它可以獲取非同步操作的訊息,promise提供了統一的api,各種非同步操作都可以用...