我正在閱讀這個答案 - https://stackoverflow.com/a/1644292/10352155
看完后,我有一些疑問,如下:
答案中說,只要該陣列運算式“衰減”到指標,您所擁有的就是指向單個元素的指標。
那么這是否意味著當陣列運算式被轉換為指標時,需要分配額外的記憶體空間(除了已經為陣列元素分配的記憶體空間)來存盤指標運算式的值(即無除了陣列的基地址)?
如果是這樣,那么它與B語言中提到為指標運算式分配單獨的記憶體空間有什么不同?
如果不是這樣并且沒有分配額外的記憶體,那么指標運算式如何存盤基地址的值?
uj5u.com熱心網友回復:
顯而易見,陣列總是在同一個記憶體位置,它不會改變,你不能移動它也不能轉換它,一旦宣告它在整個存在期間將占用相同的記憶體空間,它將用于相同的目的,用于存盤宣告型別的元素。不需要額外的記憶體,唯一使用的記憶體用于陣列元素本身。
陣列的名字不是一個元素,它只是為了參考和簡化編程程序,它被編譯掉了,因為C沒有反射它不需要,編譯器只需要陣列地址,這就是保持,它也會知道元素的數量和元素的大小,所以你可以sizeof用來渲染它所占用的總記憶體空間。
衰減程序通常發生在賦值時或當您將陣列作為引數傳遞時,您最終擁有的是一個指向現有陣列的新指標,并且該指標將包含陣列初始元素的地址,僅此而已。
該指標必須被存盤,因此,根據情況,系統知道指標的大小,它是實作定義的。
如果您使用手動記憶體分配,那么指標以及陣列的記憶體空間也必須存盤在堆中。
這也意味著您不能再sizeof像使用陣列本身那樣知道陣列的大小,而是將獲得指標的大小。
uj5u.com熱心網友回復:
轉換是在計算運算式的程序中完成的。原始陣列沒有改變。例如,在:
int x = 3;
int y = 4;
int z = x*y 7;
的乘積x和y計算為12,但是,這只是在運算中使用。既不改變x也不y改變。
同樣,在:
int a[] = { 0, 1, 2, 3 };
int *p = a 2;
的第一個元素的地址a由編譯器計算(基于它對a存盤位置的了解),并且a不會因此而改變。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/403179.html
標籤:
下一篇:我在C中的結構鏈表有問題
