陣列指標與函數
文章推薦指數: 80 %
C語言允許陣列指標和函數三者混合宣告,以表達複雜的資料結構。
對於要撰寫比較複雜的應用程式來說,了解這三者的關係是非常必要的。
例如下面的變數x到底是甚麼?
C語言允許陣列指標和函數三者混合宣告,以表達複雜的資料結構。
對於要撰寫比較複雜的應用程式來說,了解這三者的關係是非常必要的。
例如下面的變數x到底是甚麼?
char(*x[])();
要看懂這些東西,首先要查型別與運算裡有關優先權與結合序的表格,得到()[]是第一優先權左結合,而*是第二優先權右結合。
在看變數宣告時,如同運算式的推演過程,必須遵守C程式語言對*()[]的優先權定義。
接下來請讀者背誦下面的口訣
看見[]就說array[]of
看見*就說pointerto
看見變數後面的()就說function()returning
上述口訣配合*()[]的優先權,依序找出其執行的順序,每看到運算符號就把這幾句口訣念出來。
因此變數的意義如下面範例
char*x;//x:apointertochar
charx[3];//x:anarray[3]ofchar
charx();//x:afunction()returningchar
char*x[3];//x:anarray[3]ofpointertochar
char(*x)[3];//x:apointertoarray[3]ofchar
char**x;//x:apointertopointertochar
char*x();//x:afunction()returningpointertochar
char*x()[3];//x:afunction()returningarray[3]ofpointertochar
char(*x[])();//x:anarray[]ofpointertofunction()returningchar
char(*x())();//x:afunction()returningpointertofunction()returningchar
char(*(*x)[])(int,int);//x:apointertoarray[]ofpointertofunction(int,int)returningchar
讀者在閱讀上面範例時,千萬不要把這些英文翻成中文!英文文法是後面修飾前面,比中文更能確切表達文句的意義,因此在處理這些複雜宣告時,用英文去了解即可。
在讀運算式時,則每看到一個運算符號,就把宣告前面的口訣拿掉一個,就是該運算式的意義
char*x;//x:apointertochar
*x:achar
char*x[3];//x:anarray[3]ofpointertochar
x[0]:apointertochar
char**x;//x:apointertopointertochar
*x:apointertochar
char*x();//x:afunction()returningpointertochar
x():apointertochar
char*x()[3];//x:afunction()returningarray[3]ofpointertochar
x()[1]:apointertochar
下面的宣告摘錄自"TheCProgrammingLanguage"第二版的第122頁,請讀者寫出其宣告意義,並參考該書核對答案,相信可以增強讀者的自信:
char**argv;
int(*daytab)[13];
int*daytab[13];
void*comp();
void(*comp)();
char(*(*x())[])();
char(*(*x[3])())[5];
以下是計算積分的程式範例,用到pointertofunction的觀念
#include
va_list型態可用來存取每一個參數:
#include
延伸文章資訊
- 1[C語言]指標、陣列與結構 - HackMD
其中很常被應用的,就是 指標(pointer) 、 陣列(Array) 、 結構(struct) ... int a[10]; //宣告一個10個int物件的陣列 int *p[10]; //宣...
- 2C++教學(二十一):指標陣列 - 痞客邦
C++教學(二十一):指標陣列指標即然也是變數的一種,有時為了集合資料與處理 ... 上面這段程式宣告一個指標陣列ptr,它擁有10個元素,當中的每個元素都 ...
- 3指標與陣列
在宣告陣列之後,使用到陣列變數時,會取得首元素的位址,例如在下面的程式中將指出,陣列 arr 與 &arr[0] 的值是相同的: #include <stdio.h> int main(void...
- 4陣列指標與函數
C語言允許陣列指標和函數三者混合宣告,以表達複雜的資料結構。對於要撰寫比較複雜的應用程式來說,了解這三者的關係是非常必要的。例如下面的變數x到底是甚麼?
- 5重新看懂指標與陣列之間的交互關係
陣列宣告與指標宣告