摘要: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關鍵字的後面緊跟型別...