c的複雜宣告
這幾天在看c程式設計語言第二版,在看到第五章複雜宣告時,有些疑惑,在結合別人的理解上,我按自己的理解方式理解複雜宣告,並附上實際的測試例子。
1.首先選取的是 char ( * ( * x ( ) ) [ ] ) ( ) ,由外至內分解,分解如下:
a..選取左邊的char ( * ,右邊選取 ) ( ) ,合起來就成為 char ( * ) ( ) 。這表明這是一個函式指標,該函式零引數,返回 char。刪除已選的字元,剩下
( * x ( ) ) [ ]
b.選取左邊的( *,右邊選取) [ ],合起來就成為 ( * ) [ ]
x ( )
c.這裡可以看出,實際x是一個函式,該函式返回上述所得的陣列指標。
實際上char ( * ( * x ( ) ) [ ] ) ( ) 的含義,英文原版的說法是 x:function returning pointer to array[] of pointer to function returning char.我理解的意思是 函式X返回一個指標陣列,該指標陣列存放的是一組函式指標A,該函式A無引數和返回char。
借用外國的測試程式碼
#include <stdio.h> char x1() { return 'a'; } // Function returning a char char (*x2[])() = {&x1}; // Array of pointers to functions returning char char (*(*x())[])() { return &x2; } // Function returning a pointer to the above void main() { char (*x3)() = **x(); // Pointer to a function returning char printf("This is the value: %c\n", x3()); }
2.接下來的是char ( * ( * x [ 3 ] ) ( ) ) [ 5 ],由外至內分解,分解如下:
a.選取左邊的char ( *,右邊選取 ) [ 5 ] ,合起來就成為char ( * ) [ 5 ] ,這是一個數組指標,該陣列指標指向char[5].刪除已選的字元,剩下
( * x [ 3 ] ) ( )
b.選取左邊的 ( *,右邊選取 ) ( ) ,合起來就成為 ( *) ( ) 這是一個無參的函式指標,該函式返回的是一個上面所得的陣列指標,刪除已選的字元,剩下
x[3]
c.這裡可以看出x是一個有3個元素的陣列,存放的元素為上面所得函式指標。
實際上char ( * ( * x [ 3 ] ) ( ) ) [ 5 ]的含義,英文原版的說法是X:array[3] of pointer to function returning pointer to array[5] of char.我理解的意思是陣列X[3]存放的是3個函式指標,該函式指標返回一個數組指標,該陣列指標對應的是一組char[5]的陣列。
測試程式碼
#include <stdio.h>
char x1[][5]={"1234","abcd"};
char (*x2())[5]{return y1;}
char (*(*x[3])())[5]={x2};
int main(){
char (*(*p1)())[5]=y[0];
char *p2=(*p1)();
printf("%s\n",p2);
}
所以,總結一條亂說的結論,左取一括加一星,右取一對加一括,連續陣列不要緊,一次取完就穩妥。