typedef以及一些複雜表示式

2021-08-30 20:13:17 字數 2349 閱讀 1137

1. typedef int (*pfv)();

這是定義了乙個函式指標,那麼pfv p;就可以定義了乙個指向函式的指標。

2. typedef int (*p[10])();

這是把p定義為函式指標陣列,那麼 p array;語句就可以定義了乙個函式指標陣列,陣列名即為array,array這個陣列含10個元素。

3. typedef int (*parray)[3];

這是定義了乙個指向整型陣列的指標,那麼 parray ptr;就定義了乙個指向陣列的指標。如何對這個ptr賦值或者初始化呢?事實上,是通過二維陣列名來對其進行賦值(初始化)的,因為二維陣列名作為指標來講,就是乙個指向陣列的指標,一次跨越乙個陣列。

4. typedef int a[3][3];

這是把a定義為乙個3*3的整型陣列型別。當a b = 時就完成了乙個3×3的整型陣列的定義初始化的工作。同樣,簡單一點 typedef int a[3];這個語句是把a定義為乙個一維陣列型別。

5. typedef void func(int);

這個語句定義了乙個函式型別。通過這個typedef,我們可以比較清晰地定義出函式指標,func* p;即可。

6. typedef char* string; const string str;

這裡str是乙個常量指標,而不是指標常量,即const修飾符針對的是指標,而不是char。

7. typedef int* int_pointer;

定義乙個指向整型的指標型別

8. int (*p)(const&, int);

定義乙個函式指標型別,p指向的函式必須返回int,形參必須是const&和int。

9. typedef int (*func_pointer)(const&, int);

可以這樣來理解:typedef int integer;將typedef去掉,那就是個變數的定義,這兒即定義了乙個int型的變數integer,考慮這個integer是什麼型別的,那麼這個typedef語句就是將integer定義為這個型別的。將typedef int (*func_pointer)(const&, int);中的typedef去掉,就成了乙個函式指標定義,即func_pointer被定義為函式指標型別變數,那麼原來的typedef即將func_pointer定義為函式指標型別。

10. int (*testcases[10])();

它定義了陣列,testcases[10],陣列中的元素是函式指標,函式指標的型別是 int (*)();

怎麼來理解這種定義呢?首先考慮陣列的定義,陣列的定義一般模式是:型別 陣列名[大小]; 考慮這個表示式,似乎是定義了乙個陣列,但是陣列名[大小]被夾在了中間,那麼型別是什麼呢,發現型別並不是簡單的資料型別,而是乙個函式指標型int (*p)(),這個函式沒有引數,返回int型。從而這個表示式的含義是:定義了乙個函式指標型的陣列,大小是10。可以利用typedef來簡化這種定義:typedef int (*pfv)(); pfv testcases[10];

11. int (*(*(*p()))());

首先,根據p()判斷p是乙個函式,再根據p()前面的*號判斷該函式返回乙個指標,下面就看這個指標指向的是什麼類新了,我們可以把*p()替換成一 個*pointer,這個pointer就是函式p返回的指標,那麼就成了int (*(*(*pointer))());再根據(*pointer),這說明了指標pointer是指向的乙個陣列,那麼這個陣列中的元素是 什麼型別呢?由於陣列名實際上就是個指標,我們把(*pointer)(即(*p()))替換成乙個array,這樣就成了 int (*(*array)());發現array是乙個函式指標,從而陣列中的每個元素是函式指標,而這個函式呢,又返回乙個指標型別,把 (*array)()用func代替,就成了int (*func);這說明了func函式返回的是指向陣列的指標,陣列中的元素是int型。

這個表示式夠酷!!!

12. p = (int( * (*)[20])[10])q;

這是乙個強制型別轉換,q被強制型別轉換成乙個這樣的指標型別,這個指標呢直線乙個具有20個元素的陣列,這個陣列中的元素也是指標,是指向另外一種陣列,這種陣列是含有10個int型資料的一維陣列。

13. int (*ptr)[3];

這個表示式定義了乙個陣列指標(即指向陣列的指標)ptr,ptr一次跨越乙個由3個int型組成的一維陣列。發現其定義的方式與函式指標定義的方式很相似,只是把()換作了。

可見,分析複雜的表示式時(所謂複雜,即糅合了指標,陣列,函式三樣,缺少了一樣就不會複雜了),從括號的最裡層做起,最裡層的東西是複雜表示式的「根節點」,然後一層一層脫,脫的時候,是這樣的,比如裡層是個陣列,那麼就是說這個陣列的元素是什麼呢,那就是外層的東西,如果裡層是個有返回值的函式,那麼就是說這個函式返回什麼值呢?那就是外層的東西,就這樣一層一層地把表示式解析清楚。

typedef的一些用法

1.常規變數型別定義 例如 typedef unsigned char uchar 描述 uchar等價於unsigned char型別定義 uchar c宣告等於unsigned char c宣告 2.陣列型別定義 例如 typedef int array 2 描述 array等價於 int 2 ...

typedef的一些用途

用途一 定義一種型別的別名,而不只是簡單的巨集替換。可以用作同時宣告指標型的多個物件。比如 char pa,pb 這多數不符合我們的意圖,它只宣告了乙個指向字元變數的指標,和乙個字元變數 以下則可行 typedef char pchar pchar pa,pb 這種用法很有用,特別是char pa,...

typedef 與define一些差異

include define pint int typedef int pint 以下實驗說明了 1 typedef int pint const pint p1 i1 的效果是和下面的一樣的 int const p1 這裡的const鎖住的是 p1 所以p1 i2都是錯的,因為這裡記憶體位址p1已...