關於”複雜類型聲明”的分析方法

來源:互聯網
上載者:User

今天看了一個博友的文章,是關於複雜類型聲明的;於是便一起複習了一下;
做了個總結;個人感覺這個方法能夠分析任何複雜類型的聲明;
複雜類型的聲明主要涉及各種類型的指標,如果沒有指標那麼估計就沒有什麼
複雜的類型了.由於本人水平有限,還請各位大蝦多多指教.

首先看以下最基本的==============================================>

1.看一個變數是否是指標:

 如果變數左邊緊跟*;並且用括弧和變數相結合,
那邊它是指標;否則它不是;例如:
(int*)array[10]   array是指標數組,不是指標;
int (*array)[10]    array是數組指標.
---------------------------------------------------------------------------
(int *)fun()      fun 是函數
int (*fun)()        fun 是函數指標
------------------------------------------------------------------------
int *a            a是指標;
(int *)a          a 的類型未知,這裡把a強制轉換成指標

實際上指標數組,數組指標都表示一個地址,可以把數組名賦值給數組指標;
他們區別在於,數組名地址固定,而數組指標則可以指向任何同類型的數組;

函數指標和函數名也有類似關係;函數指標可以隨便指,函數名卻是一個固定地址.

2.形式上區別:

(TYPE)(*array)[SIZE]---------------------------->A
array是一個數組指標,指向數組(TYPE)ArrayName[SIZE]

(TYPE)array[SIZE]  ---------------------------->B
array是一個數組
----------------------------------------------------------------------------------
(RET TYPE)(*fun)(PARAM)------------------------->C
fun是函數指標,指向函數(RET TYPE)FuncName(PARAM)

(RET TYPE)fun(PARAM)  ------------------------->D
fun是函數

3.複雜類型分析方法:

  以聲明的變數為中心,從右至左,從裡到外;依次匹配上面A,B,C,D四個樣式;
分析完畢清理;適當添加變數;下面結合具體的例子分析.

4.舉例:

(1) int*( * (*gopher)( int(*)(int*) ) )(int*);

首先以聲明變數gopher為中心;由於它左邊緊跟一個*,並且有括弧使之和變數結合因此它是一個指標;這符合A,C是個樣式,
再向右看,右邊是圓括弧,顯然符合C樣式,說明這是一個函數指標;
右邊括弧中的是參數,剩下的是傳回型別;
再看右邊括弧中的函數參數int(*)(int*),為了和樣式對照,
我們添加適當的變數讓其變成int(*a)(int*b),顯然這符合樣式C;說明參數a 是一個函數指標,
指向的函數參數是一個int 指標;傳回值是int;
我們把分析完畢的部分(*gopher)( int(*)(int*)去掉,剩下了int*( * )(int*),這剩餘的部分是
gopher指向函數的傳回值,我們適當添加變數變為int*( *a)(int*b);這顯然又符合樣式C;
說明傳回值a也是一個函數指標;其指向函數的參數是一個int 指標;傳回值也是一個int 指標;

綜上所述,gopher是一個函數指標,指向函數(1);
函數(1)的參數是一個函數(2)指標,傳回值是一個函數(3)指標,
函數(2)的參數是int*,傳回值是int;
函數(3)的參數是int*,傳回值也是int*。

用typedef定義這個 gopher:
typedef int*( * (*gopher)( int(*)(int*)) )(int*);
以後用gopher fun1聲明,則fun1就是和gopher類型一致的函數指標了。

(2)typedef double ( * (*(*fp3)())[10] )();

首先以變數fp3為中心,由於它左邊緊跟一個*,因此它是一個指標;這符合A,C是個樣式,
再向右看,右邊是圓括弧,顯然符合C樣式,說明這是一個函數指標;
右邊括弧中的是參數,剩下的是傳回型別;
再看右邊括弧中的函數參數為空白,也就是void類型的參數;
我們把分析完畢的(*fp3)()去掉剩下double ( * (*)[10] )();適當添加變數變為double ( *(*b)[10] )();
由於b左邊緊跟一個*,因此它是一個指標;這符合A,C是個樣式,
再向右看,右邊是方括弧,顯然符合A樣式,說明傳回值b是一個數組指標;它指向一個數組;
那麼數組中的元素是什麼類型呢?我們去掉分析完畢的(*b)[10];剩下了double ( * )();
添加變數變為double ( *a)();這顯然是C的樣式,說明數組中的元素是函數指標,指向的函數參數為空白;
傳回值為double;

綜上所述:fp3是一個函數(1)指標,該函數(1)沒有參數,返回一個指標,
該指標是指向一個數組,這個數組“含有10個指向函數(2)的指標” ,
函數(2)不接受參,數,返回一個double值.

看上去分析很麻煩,其實分析多了不必完全按照上面的步驟進行也就很容易看懂了:)
下面是兩個例子,自己分析一下吧:)

(3) void*  (*(*fp1)(int))[10];
fp1是一個函數指標,該函數接受一個整型參數,返回一個指標(前面多加一個*),
該指標指向含有10個void指標數組
如果分開寫:
typedef (void**)FUN(int);
void** ppvoid = new void*[10];

(4)int (* ((*f4())[10]))(); 類似與上面的問題
f4是一個函數,返回一個指標,該指標指向含有10個函數指標的數組,這些函數返回int

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.