C語言宣告的各種複雜情況

2021-09-16 21:22:16 字數 1367 閱讀 8984

你知道 下面這個東西指什麼嗎?

char * const *(*next)();
說起來,c語言真的太容易出現各種莫名其妙(不能明白其中的奧妙)的東西了。

看下面這個東西

上面的就應該被理解為 next是乙個函式指標,它返回乙個指標,它指向乙個型別為char的常量指標。

有下面這些例子

高階宣告

看個例子    int      *a;    它把*a宣告為乙個整數,由此推斷出a是乙個指向整數的指標。所以 int   *f,g;只有f是指標,g是整型。

int   *f();   f是乙個返回指向int型別指標的函式,而 int   (*f)();  第二個括號是函式操作呼叫符,第一對括號只起到了聚組的作用,它迫使間接訪問在函式呼叫之前進行,使f成為了乙個函式指標,它所指向的函式用於返回乙個整數值。

int    *(*f)();  這個就容易理解了,f是乙個指向返回值是乙個int型別的指標的函式的指標。

int  *f[ ]; 的優先順序比*的優先順序要高,所以f是乙個陣列,然後型別是int指標。

int   f() f是乙個函式,返回值為整型陣列(非法,c語言函式無法返回陣列)

int   f() f是乙個函式的陣列 非法(函式無法統一長度,所以不可能成為陣列)

int  (*f)();  f首先是乙個陣列,然後f的元素是int型的指標,然後()又說明它勢函式,所以f是乙個函式指標的陣列,返回的值是乙個整數值

int  *(*f)(); f是返回int指標的函式的指標陣列..(1 f是陣列,f是指標陣列,f是函式指標陣列,f是返回值為int指標的函式指標陣列

巧用typedef

先看乙個有點可怕的東西

void (*signal(int sig, void(*func)(int)))(int);
哈哈,反正我看到的時候是一臉懵逼。

signal是乙個函式,返回值是乙個指向返回值為void,引數為int的函式指標。

signal的第二個引數,void(*func)(int) 表示乙個函式指標,返回值為void,接受乙個int引數。

用typedef來簡化

typedef void(*ptr_to_func) (int);

/***它定義ptr_to_func為乙個函式指標

**/ptr_to_func signal(int, ptr_to_func);

/***表示signal是乙個函式,接受另外兩個引數,返回乙個函式指標

**/

如何分析複雜的C語言宣告

宣告從它的名字開始讀取,然後按照優先順序順序以此讀取 優先順序從高到低依次是 宣告中被括號擴起來的那部分 字尾操作符 字首引數操作符 如果const和volatile關鍵字的後面緊跟著型別說明符 如int,long 那麼 它作用於型別說明符.其他情況下,從const和volatile關鍵字作用於它左...

C語言宣告

怎樣定義和宣告全域性變數和函式最好。首先,儘管乙個全域性變數或函式可以有多處宣告但是定義卻最多隻允許出現一次,對於全域性變數,定義是真正分配空間並賦初值的宣告,對於函式,定義是提供函式體的宣告。例如 這些是宣告 extern int i extern int f 而這些是定義 int i 1 int...

C語言 宣告

1 首先著眼於識別符號 變數名或者函式名 2 從距離識別符號最近的地方開始,依照優先順序解釋派生型別 指標,陣列和函式 優先順序如下 1 用於整理宣告內容的括弧 2 用於表示陣列的,用於表示函式的 3 用於表示指標的 例如int func p double func p是指向返回int型別的函式的指...