入門階段,看見類似void * (*(*fp1)(int))[10];的複雜宣告,暈乎。直接略過,這種複雜的東東,不應該是入門者需要去學習的知識。
高階階段,這種知識就必需得搞得清清楚楚了,不然還等到高階階段才學習這個麼?
現在,就來帶大家了解一下,這類複雜的宣告怎麼解?
在解之前,先看乙個入門的知識點,指標函式作為引數傳遞。
[html]view plain
copy
int func_call(string text)
void func_pointer(int (*fp)(string))
void main()
怎麼宣告函式指標相信大家都很清楚,現在就來解複雜宣告
1. void * (*(*fp1)(int))[10];
2. float (*(*fp2)(int,int,float))(int);
解1:void * (*(*fp1)(int))[10];
(1)包含fp1的最內層小括號是(*fp1):fp1是指標
(2)往(*fp1)右邊看是(int),右邊是小括號即是函式:指向帶有乙個int型引數的函式
(3)再往(*fp1)左邊看是*,當右邊是函式,左邊即是函式的返回值:且函式返回乙個指標
(4)往(*(*fp1)(int))右邊看是[10],右邊中括號表示陣列:指標指向乙個大小為10的陣列
(5)再往(*(*fp1)(int))左邊看是void *,即是陣列的型別:陣列型別為void *
好了,把整段話拼出來吧:
fp1是指標,指向帶有乙個int型引數的函式,且函式返回乙個指標,指標指向乙個大小為10的陣列,陣列型別為void *
解2:float (*(*fp2)(int,int,float))(int);
(1)包含fp2的最內層小括號是(*fp2):fp2是指標
(2)往(*fp2)右邊看是(int,int,float),右邊是小括號即是函式:指向帶有3個引數的函式
(3)再往(*fp2)左邊看是*,當右邊是函式,左邊即是函式的返回值:且函式返回乙個指標
(4)往(*(*fp2)(int,int,float))右邊看是(int),右邊小括號表示函式:指標指向帶1個整型引數的函式
(5)再往(*(*fp2)(int,int,float))左邊看是float,即是函式的返回值:函式返回float
把整段話拼出來:
fp2是指標,指向帶有3個引數的函式,且函式返回乙個指標,指標指向帶1個整型引數的函式,函式返回float
任何複雜的宣告都按此方法解,中間的變數名開始,右--左--右--左。編譯器也是按此步驟讀宣告的。
下面**示例:
[cpp]view plain
copy
typedef
void
* (*ap)[10];
ap func_fp1(int
i)
void
main()
宣告也使用型別定義會使宣告看起來更簡單一點
[cpp]view plain
copy
void
main()
[cpp]view plain
copy
float
func_f(
inti)
typedef
float
(*fp)(
int);
fp func_fp2(int
i,int
j,float
f)
void
main()
一樣可以用型別定義
[cpp]view plain
copy
void
main()
從中間開始,即從變數名fp1開始解,(*fp1)
C C 複雜宣告包你看懂
c語言有它獨特而複雜的宣告規則,在c語言中乙個宣告是由識別符號和關鍵字組成的乙個表示式,注意,這裡說的是關鍵字和識別符號一起組成的乙個表示式,關鍵字與識別符號的順序可以以符合語法的方式隨意組合。因為大多數簡單的宣告都是由左邊型別右邊識別符號 變數名 組成,所以給我們造成一種宣告語法必須先說明型別再說...
複雜的宣告
int a 整型變數 int a 整型指標變數 int a 整型指標的指標變數 int a 10 整型陣列 int a 10 整型指標陣列 int a 10 陣列指標變數 int a int 函式指標變數 int a 10 int 函式指標陣列 int fp1 int 10 fp1 函式指標變數,指...
指標 複雜的宣告
int fp1 int 10 1.從變數名開始 fp1 2.往右看,是 因此往左看,是 乙個指標 3.跳出括號,碰到了 int 乙個帶乙個int引數的函式 4.向左看,發現乙個 函式 返回乙個指標 5.跳出括號,向右看,碰到 10 乙個10元素的陣列 6.向左看,發現乙個 指標 7.向左看,發現in...