陣列與指標的區別

2021-07-15 05:51:31 字數 1449 閱讀 7515

區間分配:

陣列是開闢一塊連續的記憶體空間,陣列本身的標示符代表整個陣列,可以用sizeof取得真實的大小;指標則是只分配乙個指標大小的記憶體,並可把它的值指向某個有效的記憶體空間

[全域性的和靜態的]

char *p= "hello ";

乙個指標,指向唯讀資料塊(section)裡的 "hello ",可被編譯器放入字串池(也就是說, 你在寫乙個char *q= "hello ",可能和p共享資料)

char a= "hello ";

乙個陣列,分配在可寫資料塊(section),不會被放到字串池中

[區域性]

char *p= "hello ";

乙個指標,指向唯讀資料塊(section)裡的 "hello ",可被編譯器放入字串池(也就是說, 你在寫乙個char *q= "hello ",可能和p共享資料),另外,在函式中可以返回它的位址,也就是說,指標是區域性變數,他指向的資料卻是全域性的.

char a= "hello ";

乙個陣列,分配在堆疊上,初始化由編譯器進行(短的話直接用指令填充,長的就從全域性字串表拷貝),不會被放到字串池中(但是卻可能從字串池中拷貝過來),也不應該返回

它的位址.

[**中的字面字串]

printf( "%s\n ", "hello ");

這兩個字面常量( "%s\n "和 "hello "),都在唯讀資料塊裡

[用途]

全域性指標

用於不需要修改內容,卻可能會修改指標的情況(當然,不修改也沒人反對)

全域性陣列,用於不需要修改位址,卻需要修改內容的場合

既需要修改指標,有需要修改內容怎麼辦呢?定義乙個陣列,在定義乙個指標指向它就可以了

函式中如果不需要修改字串的內容,應該盡量用char*p= "*** "這種寫法.

初始化的區域性字元陣列影響效率,一般應該盡量避開(應該使用的情況下則不要猶豫)

陣列要麼在靜態儲存區被建立,要麼在棧上被建立。陣列名對應著一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。

指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變」,所以我們常用指標來操作動態記憶體。

訪問效率:

遍歷陣列元素,使用指標比使用下標能使程式會的更快的速度。

安全性:

指標可能會重複釋放,而且會產生野指標,從而導致記憶體的洩漏;也有可能導致堆緩衝區溢位

函式形參:

陣列在作為函式傳參時,陣列名將蛻化為指標,二維陣列的儲存方式是和一維陣列沒什麼區別,但是用二維陣列做引數,要注意的是:函式中的形參其實就相當於乙個宣告,並不產生記憶體分配,形參的目的就是要讓編譯器知道函式引數的資料型別

指標傳參傳遞的是一引數(這裡是int實參)的位址,這樣,雖然實參和形參不一樣,但是它們的位址是一樣的,所以對相同位址的數的操作會影響到原來的數

陣列指標與指標陣列的區別

一 陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,...

陣列指標與指標陣列的區別

一 陣列指標 也稱行指標 定義int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指...

陣列指標與指標陣列的區別

陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...