綜合一下typedef的用法。

2021-04-12 18:15:49 字數 3715 閱讀 3484

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,各種非同步操作都可以用...