[英]Where is an array variable stored in C language?
#include <stdio.h>
int main(){
int array[] = {1,2,3};
printf("L00: array[0]=%d \n",array[0]);
printf("L01: array[1]=%d \n",array[1]);
printf("L02: array[2]=%d \n",array[2]);
printf("L03: &array[0]=%p \n",&array[0]);
printf("L04: &array[1]=%p \n",&array[1]);
printf("L05: &array[2]=%p \n",&array[2]);
printf("L06: array=%p \n",array);
printf("L07: &array=%p \n",&array);
return 0;
}
在該程序中,L03,L06和L07分別顯示( &array
, array
和&array[0]
)相同的存儲器地址。
所以我很好奇“陣列”作為RAM中變量的位置。
如果RAM中沒有“數組”的位置,它在哪里?
我必須多次寫這篇文章,但讓我們再說一遍:
+----------+----------+----------+ | array[0] | array[1] | array[2] | +----------+----------+----------+ ^ ^ ^ ^ | | | | array | | | | | | | array + 0 array + 1 array + 2 | | | | | &array[0] &array[1] &array[2] | | | &array | | | &array + 0 &array + 1
從上面的“圖像”可以看出,第一個元素可以通過五個指針到達(兩個實際上, array
衰減到&array[0]
,而array + 0
等於array
)。
這些指針的類型可能不同但是:
&array
的類型為int (*)[3]
&array + 0
等於&array
,因此屬於同一類型 &array[0]
的類型為int *
array
衰減到&array[0]
,因此屬於同一類型 array + 0
等於array
,因此屬於同一類型 當然有其他方法可以獲得指向特定元素的指針,但它們實際上只是上述的變體。 例如(&array)[0]
等於&array + 0
,它等於&array
。
另一件值得注意的事情是,對於任何指針或數組p
和索引i
,表達式p[i]
與*(p + i)
完全相同。
你應該從中學到的最重要的事情是array
和&array
之間的區別。 即使它們都指向相同的位置,它們的類型也不同,這使得它在語義上非常不同。
除了具有“自動存儲持續時間”和本地范圍之外,C標准並未規定存儲陣列的位置。 具有自動存儲持續時間的較大變量幾乎肯定存儲在堆棧中。
至於為什么這3種不同形式的語法給出相同的地址:
array
,無論何時在表達式中使用,都會衰減為指向第一個元素的指針。 使其100%等效於&array[0]
。 &array
是指向整個數組的指針 - 一個數組指針。 這是一種不同的類型,可用於對整個數組進行指針運算,但除此之外,它仍然指向數組開始的相同地址。 (&array,array和&array [0])相同的內存地址。
是的,但它們的類型不同。
&array
的類型為int (*) [3]
。 array
的類型為int [3]
(有時會衰減為指向第一個元素的指針) &array[0]
的類型為int *
。 根據定義,數組的內存分配是連續的,它從&array[0]
並上升到n-1
元素, n
是維度。
如果RAM中沒有“數組”的位置,它在哪里?
如果用“RAM”表示物理內存地址,那么你的概念是錯誤的。 大多數情況下,你沒有直接使用任何物理內存,它是抽象給你的。 打印的內存位置來自分配給程序的虛擬進程地址空間。
根據存儲持續時間,您可以看到位置不同,即,如果陣列具有自動存儲,它將駐留在功能堆棧(調用堆棧)上,它具有static
存儲,可能它將在.bss
部分。 有時它也可能會被優化(不是在這種情況下,如果不使用),所以這取決於環境。 除非編譯器決定分配它,否則無法保證分配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.