解析C語言宣告

2021-08-31 07:35:53 字數 3011 閱讀 5117

在學習c語言的過程中,會先遇到陣列指標指標陣列此類的概念。這些概念實在是晦澀難懂,在進一步學習之後,你會發現更加恐怖的還有各種各樣的宣告,比如:

char * const *(*next)();

那麼這些宣告到底是什麼意思呢?

序號說明

a宣告從他的名字開始讀取,然後按照優先順序順序依次讀取

b優先順序從高到低依次是:a、b、c

a宣告中被括號括起來的那部分

b字尾操作符:括號表示這是乙個函式,方括號表示這是乙個陣列

c字首操作符星號*表示:指向…的指標

c如果const和(或)volatile關鍵字的後面緊跟說明符(如int,long等),那麼它的作用於型別說明,在其他情況下,const和(或)volatile關鍵字作用於它左邊緊鄰的指標星號。

用上表對宣告char * const *(*next)();進行分析:

適用規則解釋a

首先,看變數名「next」,並注意到它直接被括號括住

a所以,先把括號的東西作為乙個整體,得出「next是指向…的指標」

b然後考慮括號外面的東西,在星號字首和括號字尾之間做出選擇

bb規則告訴我們優先順序較高的是右邊的函式括號,所以得出「next是乙個函式指標,指向乙個返回…的函式」

c然後處理字首「*」,得出指標所指的內容

c最後,把「char * const」解釋為指向字元的常亮指標

綜上:把上訴分析結果概括起來,這個宣告表示「next是乙個指標,指向乙個函式,該函式返回另乙個指標,該指標指向乙個型別為char的常量指標。

如果你覺得分析太麻煩,這裡有乙個超級方便的方法,就乙個c程式,執行後直接輸入就能得出答案,例項如下:

輸入上面的例項:char * const *(*next)();得到下圖結果:

同時也能輸入乙個簡單的如:int *fun(); 這個就很簡單表示:乙個函式,返回乙個指向int的指標。

下面貼出這份程式的**:

#include #include #include #include #define maxtokens 100

#define maxtokenlen 64

enum type_tag ;

struct token

;int top = -1;

struct token stack[maxtokens];

struct token this;

#define pop stack[top--]

#define push(s) stack[++top] = s

/* figure out the identifier type */

enum type_tag classify_string(void)

if (!strcmp(s, "volatile"))

return qualifier;

if (!strcmp(s, "void"))

return type;

if (!strcmp(s, "char"))

return type;

if (!strcmp(s, "signed"))

return type;

if (!strcmp(s, "unsigned"))

return type;

if (!strcmp(s, "short"))

return type;

if (!strcmp(s, "int"))

return type;

if (!strcmp(s, "long"))

return type;

if (!strcmp(s, "float"))

return type;

if (!strcmp(s, "double"))

return type;

if (!strcmp(s, "struct"))

return type;

if (!strcmp(s, "union"))

return type;

if (!strcmp(s, "enum"))

return type;

return identifier;

}/* read next token into "this" */

void gettoken(void)

if (*p == '*')

this.string[1] = '\0';

this.type = *p;

return;

}/* the piece of code that understandeth all parsing */

void read_to_first_identifier()

printf("%s is ", this.string);

gettoken();

}void deal_with_arrays()

gettoken(); /* read next past the ']' */

printf("of ");

}}void deal_with_function_args()

gettoken();

printf("function returning ");

}void deal_with_pointers()

}void deal_with_declarator()

deal_with_pointers();

/* process tokens that we stacked while reading identifier */

while (top >= 0)

else

}}int main()

直接貼上複製就能使用!!

C語言宣告解析

首先,來看乙個簡單的例子 int a1 a1是乙個int int a2 a2是乙個陣列,它的每乙個元素是乙個int int a3 a3是乙個陣列,它的每乙個元素是乙個int 即,它的每乙個元素是乙個指向int的指標 int a4 a4是乙個指標,它指向乙個int陣列 可能上面的3 4兩行比較容易混淆...

深入解析C語言宣告

如果說c語言宣告很簡單的人不是牛人就是還沒入門。本文來講解c語言的宣告的一些基本內容,很多內容參考 c專家程式設計 首先由乙個最簡單的問題引入,你知道 int p 5 和 int p 5 的區別在 嗎?把後面的答案遮到,想想。也許你知道反正乙個是含有五個指向整型的指標元素的指標陣列,另乙個是指向乙個...

深入解析C語言宣告

如果說c語言宣告很簡單的人不是牛人就是還沒入門。本文來講解c語言的宣告的一些基本內容,很多內容參考 c專家程式設計 首先由乙個最簡單的問題引入,你知道 int p 5 和 int p 5 的區別在 嗎?把後面的答案遮到,想想。也許你知道反正乙個是含有五個指向整型的指標元素的指標陣列,另乙個是指向乙個...