2012-07-12 53 views
3

朋友我只是在玩弄一些指針程序,並意識到GCC(也可能是C標準)區分靜態和動態數組。靜態和動態數組之間的區別

動態數組擁有數組中元素地址的佔位符,而對於靜態數組而言,沒有內存位置,編譯器存儲元素數組的起始地址。

我有一個示例程序來演示我的困惑。

#include <iostream> 
#int main(void) 
{ 
    int _static[10]; 
    int *_dynamic; 

    _dynamic = new int [10]; 

    std::cout<<"_static="<<_static<<" &_static="<<&_static<<" &_static[0]="<<&_static[0]<<std::endl; 
    std::cout<<"_dynamic="<<_dynamic<<" &_dynamic="<<&_dynamic<<" &_dynamic[0]="<<&_dynamic[0]<<std::endl; 

    return 0; 
} 

對於上面的程序,_static&_static[0]返回預期線在相同的地址。但是,&_static也會返回與另外兩個地址相同的地址。

因此,_static&_static指的是相同的號碼(或我們想稱之爲的地址)。正如預期的那樣,_dynamic&_dynamic表示不同的位置。

那麼,爲什麼C標準說_static&_static必須指向相同的位置。這聽起來很混亂。我覺得的一個原因是&_static沒有多大意義。但是,那麼它的使用不會被報告爲一個錯誤呢?

有人能幫我解決這個困惑嗎?

+2

因爲數組** **衰變到指針。 '_static'衰變爲指向輸出的第一個元素的指針,並且由於不存在對'int *'的重載,就像'char *'(它輸出字符串的地方)一樣,保存在'int *被用來代替。因此'_static'輸出一個指向第一個元素的值,或者'&_static [0]'。 – chris 2012-07-12 04:35:25

+1

你可能會對這篇文章感興趣http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c你可以在這裏學習所有關於數組的知識。 – 2012-07-12 04:36:33

+2

它們在衰變時發出希格斯玻色子嗎? – 2012-07-12 04:36:48

回答

4

其實_static&_static不是指同一個位置。他們出現的唯一原因是因爲您在使用_static衰減爲指針的上下文中。也就是說,你用它們的方式,你取得它們指的是相同的位置。但他們之前並沒有這樣做 - 一個是陣列,另一個是指針。他們不可能是相同的,因爲他們是根本不同的東西。在靜態簡單的話

+0

「腐爛成指針」這個詞對我來說似乎有些陌生。你能否詳細說明一下? – 2012-07-12 04:48:11

+1

術語「衰減」用於表示數組變成指向其第一個元素的方式,在過程中丟失其大小信息。這就是爲什麼'sizeof(_static)'和'sizeof(&_ static)'是不同的。與sizeof一起使用時,數組不會衰減,但在傳遞給operator <<時會衰減(如示例代碼中所示)。 – 2012-07-12 04:50:46

9

函數內部的靜態數組在堆棧上分配。這種方式_static(指向第一個條目的指針衰減),&_static[0]&_static具有相同的值,相同的內存地址。

在另一方面,一個動態數組實際上指向一個連續的內存區域。只有指針存儲在堆棧中。這就是爲什麼&_dynamic(來自堆棧)和_dynamic(來自堆棧)有所不同。

希望這個圖顯示了一切:

static vs dynamic arrays

也看看這個article about static and dynamic global arrays繼續the distinction between extern and non-extern

+0

+1圖片,這真的很棒! – huon 2012-07-12 04:58:38

0

在堆棧中創建和動態在堆中創建,在靜態數組,你必須告訴程序運行前的大小,但在動態的,你可以從用戶接受輸入,然後使該大小的數組。

實施例靜:

int array[5]; 

實施例動態:

int *array; 
cout << "Enter size of array: "; 
cin >> size; 
array = new int[size]; 
相關問題