陣列和指標不等價的乙個典型案例就是求陣列的長度,這個時候只能使用陣列名,不能使用陣列指標,前面我們已經強調過了,這裡不妨再來演示一下:
複製純文字複製
#includeintmain();
int*p = a;
int len_a =
sizeof
(a)/
sizeof
(int
);int len_p =
sizeof
(p)/
sizeof
(int
);printf
("len_a = %d, len_p = %d\n"
, len_a, len_p);
return0;
}
#include
int main();
int *p = a;
int len_a = sizeof(a) / sizeof(int);
int len_p = sizeof§ / sizeof(int);
printf(「len_a = %d, len_p = %d\n」, len_a, len_p);
return 0;
}執行結果:
len_a = 6, len_p = 1
陣列是一系列資料的集合,沒有開始和結束標誌,p 僅僅是乙個指向 int 型別的指標,編譯器不知道它指向的是乙個整數還是一堆整數,對 p 使用 sizeof 求得的是指標變數本身的長度。也就是說,編譯器並沒有把 p 和陣列關聯起來,p 僅僅是乙個指標變數,不管它指向**,sizeof 求得的永遠是它本身所占用的位元組數。
站在編譯器的角度講,變數名、陣列名都是一種符號,它們最終都要和資料繫結起來。變數名用來指代乙份資料,陣列名用來指代一組資料(資料集合),它們都是有型別的,以便推斷出所指代的資料的長度。
對,陣列也有型別,這是很多讀者沒有意識到的,大部分c語言書籍對這一點也含糊其辭!我們可以將 int、float、char 等理解為基本型別,將陣列理解為由基本型別派生得到的稍微複雜一些的型別。sizeof 就是根據符號的型別來計算長度的。
對於陣列 a,它的型別是int [6]
,表示這是乙個擁有 6 個 int 資料的集合,1 個 int 的長度為 4,6 個 int 的長度為 4×6 = 24,sizeof 很容易求得。
對於指標變數 p,它的型別是int *
,在 32 位環境下長度為 4,在 64 位環境下長度為 8。
歸根結底,a 和 p 這兩個符號的型別不同,指代的資料也不同,它們不是一碼事,sizeof 是根據符號型別來求長度的,a 和 p 的型別不同,求得的長度自然也不一樣。
對於二維陣列,也是類似的道理,例如int a[3][3]=;
,它的型別是int [3][3]
,長度是 4×3×3 = 36,讀者可以親自測試。
程式語言的目的是為了將計算機指令(機器語言)抽象**類能夠理解的自然語言,讓程式設計師能夠更加容易地管理和操作各種計算機資源,這些計算機資源最終表現為程式語言中的各種符號和語法規則。
整數、小數、陣列、指標等不同型別的資料都是對記憶體的抽象,它們的名字用來指代不同的記憶體塊,程式設計師在編碼過程中不需要直接面對記憶體,使用這些名字將更加方便。
編譯器在編譯過程中會建立一張專門的**用來儲存名字以及名字對應的資料型別、位址、作用域等資訊,sizeof 是乙個操作符,不是函式,使用 sizeof 時可以從這張**中查詢到符號的長度。
與普通變數名相比,陣列名既有一般性也有特殊性:一般性表現在陣列名也用來指代特定的記憶體塊,也有型別和長度;特殊性表現在陣列名有時候會轉換為乙個指標,而不是它所指代的資料本身的值。
C語言 陣列與指標不等價
陣列與指標是不等價的,如 陣列名的指向不可以改變,而指向陣列的指標是可以改變的。請看如下 include int main void p a char i 陣列遍歷方式一 for i 0 i 5 i 陣列遍歷方式二 for i 0 i 5 i return 0 陣列遍歷方式一 使用指標遍歷陣列元素,...
關於函式指標陣列和函式指標陣列的指標的一些理解
首先我們一聽函式指標陣列是不是有點繞,其實不要想多了,就簡單的來考慮,函式指標陣列。首先它就是乙個陣列,然後是乙個指標,乙個函式指標指向了這個陣列。下面我們來舉乙個簡單的例子 char p 3 char p 這是乙個陣列,它的陣列名是p,陣列裡面存了三個指向陣列的指標,這些指標的型別是指向字元的指標...
陣列指標和指標陣列的一點小小理解
最近要找工作了,做了一些面試題目,發現變成基礎這塊的知識是一點也不存在了,而面試題目總是挑我們不清楚的東西來回折騰,這不在陣列指標和指標陣列這塊又出現問題了,筆者又好好的回憶了下,然後做個小小筆記,防止再忘。int p n 指標陣列 指標的陣列 理解方法 首先的優先順序高,所以 int p n 其中...