C語言中的宣告解析規則 陣列,指標與函式

2021-06-18 10:21:55 字數 2001 閱讀 6442

摘要:c語言的申明存在的最大問題是:你無法以一種人們所習慣的自然方式和從左向右閱讀乙個宣告,在引入voliatile和const關鍵字以後,情況更加糟糕了。由於這些關鍵字只能出現在宣告中,是的宣告形式和使用形式完全對上號的例子越來越少了。而c語言中比較繞人的指標陣列和陣列指標的問題,int *ap[]和int (*ap)[]誰是指標陣列,誰又是陣列指標?這裡面宣告的解析規則是什麼樣的?本文主要為你解答這些疑惑。

我們來看看下面的語句,和它們對應的編譯結果:

int (*ap)[2]={1,2};

/*stringcat.c:6:3: warning: initialization makes pointer from integer without a cast [enabled by default]

14 stringcat.c:6:3: warning: (near initialization for 『ap』) [enabled by default]

15 stringcat.c:6:3: warning: excess elements in scalar initializer [enabled by default]

16 stringcat.c:6:3: warning: (near initialization for 『ap』) [enabled by default]

17 */

int (*ap)[2]=int(*)[2]a;

18 /*stringcat.c:7:16: error: expected expression before 『int』

20 */

int a[2]={1,2}

int (*ap)[2]=(int(*)[2])a;//注意,此處申明的不是乙個陣列而是乙個指標

注意,這個才是正確的,但是你能看出上面宣告的是乙個指標而不是乙個陣列嗎?

指標和陣列之所以複雜,主要原因就再次:他們的宣告和使用形似並不相同。來看看c語言的宣告是如何形成的?

宣告器就是識別符號以及與它組合在一起的任何指標,函式括號和陣列下標等。

構造宣告要遵循以下條件:

函式返回值不能是乙個函式:foo()()

函式返回值不能是乙個陣列:foo()[]

陣列裡面不能有函式:foo[]()

但可以這樣:

函式可以返回函式指標:int (*fun())()

函式可以返回指向陣列的指標:int(*foo())[]

陣列裡面允許函式指標:int(*foo[])()

陣列裡面允許其他陣列:int foo[][]

這裡面,比較qipa的有三種類別,陣列,函式,指標。

一般定義:int a;

陣列:int a[5];

函式:int fun();

指標:int *p;

尤其是陣列和函式,我們可以認為他們的變數處在型別修飾符(不過把運算子也算作型別的話)的中間。

我們接下來看看c語言的優先順序規則

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

b:優先順序從高到低的次序是

b1:宣告中被括號擴起來的部分

b2:字尾操作符() []

b3:字首操作符*

c:const和volatile關鍵字後面緊跟型別說明符的話(int,long),那麼它作用與型別說明符號;反之,它作用與左邊挨著的*

如此,可以分析char * const * (*next)()

具體的分析過程按照上述即可,結果是:next是乙個指標,它指向乙個函式,這個函式返回另乙個指標,該指標是指向型別為char的常量指標。

然後再來分析以往我們提出的例子就簡單多了:int (*ap)[2],ap是乙個指標,這個指標指向長度為2的int型別的陣列;int *ap[2],ap是乙個長度為2的陣列,陣列中的每個元素是指向int型別的指標。這樣就明晰了陣列指標和指標陣列的區別。

乙個關於指標的題目:

#include

void main()

想想其中的倒數第1和第3行分別表示什麼意義?

C語言中的陣列 指標陣列 陣列指標

1 include 2 3 int main 4 執行結果 0xbfeefda9 0xbfeefdaa 0xbfeefdab12 70xbfeefda9 0xbfeefdaa 0xbfeefdab12 7以上執行結果可以得出如下結論 char str 3 1 str i strr i 2 str i...

C語言中的陣列指標

一 c語言中的陣列有自己特定的型別 陣列的型別由元素型別和陣列大小共同決定 例如 int array 5 的型別為 int 5 二 定義陣列型別 c語言中通過typedef為陣列型別重新命名 typedef type name size 陣列型別 typedef int aint5 5 typede...

C語言中宣告的優先順序規則

a 宣告從它的名字開始讀取,然後按照優先順序規則順序讀取 b 優先順序從高到低依次是 b.1 宣告中被括號括起來的部分 b.2 字尾操作符 括號 表示這是乙個函式,而 方括號表示這是乙個陣列 b.3 字首操作符 星號 表示 指向.的指標 c 如果const和 或 volatile關鍵字的後面緊跟型別...