我正在學習 C ,并讀到當一個陣列被傳遞給一個函式時,它會衰減為一個指標。我想玩這個并撰寫以下函式:
void size_print(int a[]){
cout << sizeof(a)/sizeof(a[0]) << endl;
cout << "a ->: " << sizeof(a) << endl;
cout << "a[0] ->" << sizeof(a[0]) << endl;
}
我嘗試輸入一個包含三個元素的陣列,比方說
int test_array[3] = {1, 2, 3};
有了這個輸入,我期望這個函式列印 1,因為我認為a這將是一個整數指標(4 個位元組),a[0]也將是 4 個位元組。然而,令我驚訝的是結果是 2 和sizeof(a) = 8。
我不明白為什么a占用8個位元組,但a[0]占用了4個。它們不應該是一樣的嗎?
uj5u.com熱心網友回復:
他們不應該是一樣的嗎?
不。a是(應該是)一個陣列(但因為它是一個函式引數,已調整為指向第一個元素的指標),因此具有指標的大小。您的機器似乎有 64 位地址,因此,每個地址(以及每個指標)都是 64 位(8 位元組)長。
a[0],另一方面,是該陣列的元素具有的型別(an int),并且該型別在您的機器上具有 32 位(4 個位元組)。
uj5u.com熱心網友回復:
指標只是變數開始所在的記憶體地址。該地址是 8 個位元組。
a[0]是陣列第一位的變數。從技術上講,它可以是任何大小的任何東西。當您使用指向它的指標時,該指標僅包含記憶體地址(整數),而無需知道或關心該地址包含的內容。(這只是為了說明這個概念,在問題的示例中,a[]是一個整數陣列,但相同的邏輯適用于任何事物)。
注意,指標的大小實際上在不同的體系結構上是不同的。這就是 32 位、64 位等的用武之地。它也可以依賴于編譯器,但這不是問題。
uj5u.com熱心網友回復:
指標的大小取決于系統和實作。您使用 64 位(8 個位元組)。
a[0]是一個整數,標準只給出了它必須存盤的最小最大值的指示。它可以是 2 個位元組以上的任何內容。大多數現代實作使用 32 位(4 位元組)整數。
sizeof(a)/sizeof(a[0])對函式引數不起作用。陣列由參考傳遞,這個除法只會告訴你指標的大小比整數的大小大多少倍,而不是指標參考的物件的大小。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360369.html
下一篇:C遞增指標地址傳遞給函式 運算子
