指標和陣列在c語言中的用法最容易讓人迷惑,所有的經典名著中都對這其中的概念仔細強調。那麼到底是否一樣那? 答案肯定是不一樣的,要不然的話為什麼還有這兩個不同的概念那? 容易混淆的重點就在於他們的用法有相同的一面,但是這不能充分的證明,他們是一樣的!他們確實是不一樣的.
指標和陣列在一段程式中顯露的最早跡象,就應該是宣告或者定義了。就在它們剛剛出生的這一刻,是我們最容易分辨它們到底是不是一樣的最好時機,所有的事物在不斷的發展變化的過程中,就越不容易看清它們的本質。舉個例子:
file 1:
int c[100];
file 2:
extern int *c;
在檔案1中,定義了乙個整形陣列c,在檔案2中宣告了c.但是這樣會發生執行時的錯誤,這就能說明陣列和指標是不一樣的,如果二者當做一樣的處理,就會發生執行時錯誤。這裡面涉及到乙個宣告和定義的概念,c語言中定義只能出現一次,但是宣告可以出現很對次,是乙個一對多的問題。定義也可以看做宣告的一種特殊形式,他只是多做了為變數分配空間,可能初始化變數這兩件事情。
那麼到底是**不一樣那?這樣混用為什麼又發生執行時錯誤那?問題就在於陣列和指標的訪問方式是不一樣的!!!
如 char a[2] = "ab"; 訪問a[i]的過程是 1,編譯器符號表中有乙個陣列a的位址,比如9980. 2.取 (9980 + i)位址內的內容就得到了a[i];
若是指標訪問陣列 char *p = a; p[i],這樣的情況:1.編譯器符號表中有乙個指標p的位址,比如9980. 2。取指標位址內的內容,也就是陣列的位址 比如 4480. 3.取 (4480 + i)位址內的內容就是取到的字元了。
再回到上面的例子,檔案2中被告知c是乙個指標,所以它會通過指標的方式訪問,將c指標內的內容作為陣列的位址,偏移引用,而實際上那c指標內的內容是陣列的首元素,乙個首元素的值當做位址訪問,自然會出問題。
它們兩個還有一些其他的不同點: 指標
陣列儲存資料的位址
儲存資料
通常用於動態資料結構
通常用於存數固定數目且資料型別相同的元素
相關函式為malloc()和 free()
隱式分配和刪除
指向匿名資料
自身即為資料名
宣告時兩者表現出了不同,那麼他倆又是怎麼表現出相同的,使那麼多人迷惑的那? 主要就是在使用時的兩方面:
1.在表示式中,指標和陣列是可以互換的。(陣列名轉化成指向陣列第乙個元素的指標)
int a[10], *p ,i = 2;
(1), p = a; p[i];
(2). p = a; *(p + i);
(3). p = a + i; *p;
這3種方法都可以訪問 a[i].
在下面的情況下,對陣列的引用不能用指向該陣列第乙個元素的指標代替:
1、陣列作為sizeof()的運算元-------顯然此時需要的是整個陣列的大小,不是指標的大小。
2、使用&操作符取陣列的位址。
3、陣列是乙個字串常量初始值。 如 char a = "hello"; 這個時候的陣列名a是不退化的。
2.在函式引數的宣告中,陣列名總是退化為指標的,所以引數中宣告是指標或者陣列都是可以的。無論是什麼樣的,最終都會轉成指標,這種方式有助於函式呼叫時提高效率。
指標陣列和陣列指標
有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...
指標陣列和陣列指標
理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...
指標陣列和陣列指標
該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...