最近重新研讀了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,則看出這個函數的返回值是一個整型。到此解讀完畢。
簡要的說就是:聲明瞭一個函數指針,這個函數接收一個整型指針和一個字符指針作爲參數,返回函數指針,這個函數指針指向的函數接收一個整型參數,返回一個整型。