在學習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 的區別在 嗎?把後面的答案遮到,想想。也許你知道反正乙個是含有五個指向整型的指標元素的指標陣列,另乙個是指向乙個...