[英]Difference between a static and dynamic array
朋友我剛剛玩了一些指針程序,並意識到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
沒有多大意義。 但那么它的使用不應該被報告為錯誤嗎?
有人可以幫我解決這個困惑嗎?
函數內的靜態數組在堆棧上分配。 這樣_static
(作為第一個條目的指針衰減), &_static[0]
和&_static
具有相同的值,相同的內存地址。
另一方面,動態數組實際上是指向連續存儲區的指針。 只有指針存儲在堆棧中。 這就是為什么&_dynamic
(來自堆棧)和_dynamic
(來自堆)的不同。
希望這張圖片顯示一切:
實際上_static
和&_static
沒有引用相同的位置。 它們出現的唯一原因是因為你在一個上下文中使用_static
,它會衰變成一個指針。 也就是說,通過您使用它們的方式,您可以將它們引用到相同的位置。 但他們之前沒有這樣做 - 一個是數組而另一個是指針。 它們不可能是相同的,因為它們是根本不同的東西。
簡單來說,靜態是在堆棧中創建的,動態是在堆中創建的,在靜態數組中,您必須在程序運行之前告訴大小,但在動態中,您可以從用戶獲取輸入,然后生成該大小的數組。
靜態示例:
int array[5];
動態示例:
int *array;
cout << "Enter size of array: ";
cin >> size;
array = new int[size];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.