c語言複雜變量聲明(數組、指針、函數)

最近重新研讀了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,則看出這個函數的返回值是一個整型。到此解讀完畢。

簡要的說就是:聲明瞭一個函數指針,這個函數接收一個整型指針和一個字符指針作爲參數,返回函數指針,這個函數指針指向的函數接收一個整型參數,返回一個整型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章