最近重新研讀了c語言指標方面的資料,現在對c語言中複雜聲明進行總結。
這裡指的複雜聲明指的是解讀像下面這種聲明代碼含義的。
int (*(*x)(int *,char *))(int);
(以上代碼聲明了一個函數指標,這個函數接收一個整型指標和一個字元指標作為參數,函數指標,這個函數接收一個整型參數,返回一個整型。)
c語言變數的聲明始終貫徹兩點:1.聲明和使用的文法盡量保持一致
例如:聲明一個函數指標
double (*fun)(double);
使用這個函數指標
#include <math.h>fun=sin;doube reslut=(*fun)(0.5);//use point fun
2.聲明語句不是的閱讀不是按照從左往右的讀取順序,而是要根據各個符號的優先順序進行閱讀的
這一點非常重要,是判斷一個聲明到底是聲明了一個什麼變數的準則。具體講有三類聲明符:
* () [ ]
其中“*”聲明指標,各種各樣的指標,包括函數指標;
“()”是專門用來聲明函數指標的;
“[ ]”是用來聲明數組的。
三個運算子“[ ]”和“()”的優先順序別最高,結合律是“自右向左”。
明確了這兩點後,我們就可以使用這兩點來解讀複雜聲明了。
具體規則:首先從聲明的變數符開始根據優先順序進行閱讀,判斷定申明了一個什麼變數。然後一層一層逐級向外拆開。*則申明了指標;[ ]則申明了數組;()則申明了函數。
例如解讀本文一開始的例子:
int (*(*x)(int *,char *))(int);
首先找到x,然後根據優先順序找到*x,則證明整條語句聲明了一個指標。再繼續看到(*x)右邊是一個()符,則證明x是一個指向函數的指標,既然是函數指標那剩下的部分就是描述函數傳回值類型和參數類型;再看()裡則可以解讀出函數的輸入是一個整型指標和一個字元指標。然後再以“(*x)(int *,char *)”為整體看,找到優先順序最高的是*符號,則證明傳回值是一個指標;再繼續看找到了(int)則證明這個指標是指向一個函數的,函數的參數是整型;再繼續找到最後一個int,則看出這個函數的傳回值是一個整型。到此解讀完畢。
簡要的說就是:聲明了一個函數指標,這個函數接收一個整型指標和一個字元指標作為參數,返回函數指標,這個函數指標指向的函數接收一個整型參數,返回一個整型。