[C++ rudiment][转]typedef 使用
?首先可以肯定的是,我們不能這樣去理解,因為雖然我們按照這樣的理解方式去理解對于上面這種形式(typedef int integer)可以通過,但是對于其它方式是通不過的。
??考慮這樣的問題:如何定義一個指向整型的指針類型?如何定義一個函數指針類型?
?第一個問題很簡單:typedef int* int_pointer;即可,對于第二個問題,似乎就沒有那么簡單了,首先,看函數指針的定義方法:int (*p)(const&, int); 這個p指向的函數必須返回int,形參必須是const&和int?,F在要將這種指針類型命名為func_pointer,其定義的方法如下:
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定義為函數指針類型。
?int (*testCases[10])();
?? 這個表達式是什么意思?指針,數組,函數糅合在了一起問題變得復雜起來。它定義了數組,testCases[10],數組中的元素是函數指針,函數指針的類型是 int (*)();
?? 怎么來理解這種定義呢?首先考慮數組的定義,數組的定義一般模式是:類型 數組名[大小];
考慮這個表達式,似乎是定義了一個數組,但是數組名[大小]被夾在了中間,那么類型是什么呢,發現類型并不是簡單的數據類型,而是一個函數指針類型int (*p)(),這個函數沒有參數,返回int型。從而這個表達式的含義是:定義了一個函數指針型的數組,大小是10??梢岳?/span>typedef來簡化這種定義:
typedef int (*PFV)();
PFV testCases[10];
其實int (*testCases[10])();這兒我們定義了一個函數指針數組,數組是主體。
?
下面考慮這樣的問題:如何定義一個指向數組的指針?
?? 指向數組的指針,好像比較新鮮,所謂指向數組的指針,即指針的一步跨越是一個數組,跟指向整型的指針一步跨越一個整型一個道理。事實上前面已經碰到了指向數組的指針,如二維數組名,實際上就是一個指向數組的指針,它一次跨越一行的數據,實際上即是跨越了一個一維數組,而三維數組名呢,也是一個指向數組的指針,它一次跨越的是低維組成的一個二維數組。
?? 數組指針(即指向數組的指針)的定義: int (*ptr)[3];?
?? 這個表達式定義了一個數組指針ptr,ptr一次跨越一個由3個int型組成的一維數組。發現其定義的方式與函數指針定義的方式很相似,只是把()換作了[]。更進一步,如果要定義一個指向數組的指針,而數組中的元素不是簡單的int型,而是比較復雜的類型,那該如何定義呢?事實上數組指針這種東西就已經夠稀有的了,一般編程絕對不會用到,我們只需要能讀懂一些比較復雜的東西就行了,自己沒有必要構造這么復雜的類型。
?
比較復雜的表達式:
1、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型。
這個表達式夠酷!!!
?
2、p = (int( * (*)[20])[10])q;
?? 這是一個強制類型轉換,q被強制類型轉換成一個這樣的指針類型,這個指針呢直線一個具有20個元素的數組,這個數組中的元素也是指針,是指向另外一種數組,這種數組是含有10個int型數據的一維數組。
?
?? 可見,分析復雜的表達式時(所謂復雜,即糅合了指針,數組,函數三樣,缺少了一樣就不會復雜了),從括號的最里層做起,最里層的東西是復雜表達式的“根節點”,然后一層一層脫,脫的時候,是這樣的,比如里層是個數組,那么就是說這個數組的元素是什么呢,那就是外層的東西,如果里層是個有返回值的函數,那么就是說這個函數返回什么值呢?那就是外層的東西,就這樣一層一層地把表達式解析清楚。
關于typedef還有一些要說的:
typedef? int (*PFV)(); 這是定義了一個函數指針,那么PFV p;就可以定義了一個指向函數的指針。
typedef int (*p[10])(); 這是把p定義為函數指針數組,那么 p array;語句就可以定義了一個函數指針數組,數組名即為array,array這個數組含10個元素。
typedef int (*parray)[3];這是定義了一個指向整型數組的指針,那么 parray ptr;就定義了一個指向數組的指針。如何對這個ptr賦值或者初始化呢?事實上,是通過二維數組名來對其進行賦值(初始化)的,因為二維數組名作為指針來講,就是一個指向數組的指針,一次跨越一個數組。
typedef int a[3][3]; 這個語句什么意思呢?這是把a定義為一個3*3的整型數組類型。當a b = {1}時就完成了一個3×3的整型數組的定義初始化的工作。
同樣,簡單一點 typedef int a[3];這個語句是把a定義為一個一維數組類型。
typedef? void func(int); 這個語句定義了一個函數類型。通過這個typedef,我們可以比較清晰地定義出函數指針,func* p;即可。
?
typedef char* string;
const string str;
這個str是什么類型的呢?const char * str,即指向常量的指針類型?事實上,答案有些不可思議,str是一個常量指針,而不是指針常量,即const修飾符針對的是指針,而不是char
?
轉載于:https://www.cnblogs.com/krisdy/archive/2009/06/15/1503689.html
總結
以上是生活随笔為你收集整理的[C++ rudiment][转]typedef 使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手动安装boost库
- 下一篇: C++ operator操作符重载(++