指標與陣列的區別 一

2022-09-15 12:54:16 字數 1082 閱讀 5087

來自:

指標和陣列的區別

a.指標和陣列的分配

陣列是開闢一塊連續的記憶體空間,陣列本身的識別符號(也就是通常所說的陣列名)代表整個陣列,可以使用sizeof來獲得陣列所佔據記憶體空間的大小(注意,不是陣列元素的個數,而是陣列佔據記憶體空間的大小,這是以位元組為單位的)。舉例如下:

陣列a為字元型,後面的字串實際上佔據6個位元組空間(注意最後有乙個\0標識字串的結束)。從後面sizeof(b)就可以看出如何獲得陣列佔據的記憶體空間,如何獲得陣列的元素數目。至於int資料型別分配記憶體空間的多少,則是編譯器相關的。gcc預設為int型別分配4個位元組的記憶體空間。

b.空間的分配

這裡又分為兩種情況。

第一,如果是全域性的和靜態的

char *p = 「hello」;

這是定義了乙個指標,指向rodata section裡面的「hello」,可以被編譯器放到字串池。在彙編裡面的關鍵字為.ltorg。意思就是在字串池裡的字串是可以共享的,這也是編譯器優化的乙個措施。

char a = 「hello」;

這是定義了乙個陣列,分配在可寫資料塊,不會被放到字串池。

第二,如果是區域性的

char *p = 「hello」;

這是定義了乙個指標,指向rodata section裡面的「hello」,可以被編譯器放到字串池。在彙編裡面的關鍵字為.ltorg。意思就是在字串池裡的字串是可以共享的,這也是編譯器優化的乙個措施。另外,在函式中可以返回它的位址,也就是說,指標是區域性變數,但是它指向的內容是全域性的。

char a = 「hello」;

這是定義了乙個陣列,分配在堆疊上,初始化由編譯器進行。(短的時候直接用指令填充,長的時候就從全域性字串表拷貝),不會被放到字串池(同樣如前,可能會從字串池中拷貝過來)。注意不應該返回它的位址。

c.使用方法

如果是全域性指標,用於不需要修改內容,但是可能會修改指標的情況。

如果是全域性陣列,用於不需要修改位址,但是卻需要修改內容的情況。

如果既需要修改指標,又需要修改內容,那麼就定義乙個陣列,再定義乙個指標指向它就可以了

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

一 陣列指標 也稱行指標 定義 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 該語句是定義乙個陣列指標,指向...