來自:
指標和陣列的區別
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 該語句是定義乙個陣列指標,指向...