1. 程式人生 > >c的複雜宣告

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);
}


所以,總結一條亂說的結論,左取一括加一星,右取一對加一括,連續陣列不要緊,一次取完就穩妥。