這個問題在這里已經有了答案: 通過指標算術計算陣列長度 3 個答案 12 天前關閉。
我是 C 新手,偶然發現了這種用我不完全理解的指標計算陣列長度的方法。我到處看了看,但似乎無處解釋它是如何作業的,我只是聽說它應該是計算陣列長度的一種不好的方法,但為什么會這樣,它是如何作業的?
代碼看起來像這樣:
int array[4] = [0, 1, 2, 3]
//...
int length = *(&array 1) - array
據我嘗試,它似乎確實有效,但我不完全明白為什么。我知道一點指標邏輯,但這個陳述句對我來說似乎很奇怪,因為你實際上是在獲取陣列的地址(我想是第一個元素)并向其中添加一個(我可以想象這會給你地址在最后一個元素之后,但我不明白你為什么要取消參考它)。最讓我困惑的是,這一切都被陣列本身減去了嗎?!沒有索引或任何東西。
如果有人能夠向我解釋這一點,以及為什么它應該是壞的,那真的很有幫助。
謝謝。
uj5u.com熱心網友回復:
&array
這是一個指向物件的指標array。它是陣列型別的奇異物件。
&array 1
向指標添加數字會生成指向物件陣列中物件的連續兄弟的指標。加 1 產生下一個兄弟。出于此指標演算法的目的,單個物件被視為單個物件的陣列。因此,允許添加 1,并且它會產生一個指標超過圖形陣列的末尾。
*(&array 1)
嚴格來說,這通過指標過去間接間接,并且可能會爭辯說程式的行為是未定義的。
但是讓我們假設這不是問題。間接操作在陣列后面的地址處為(不存在的)物件生成一個左值。
*(&array 1) - array
這里,減法的運算元是陣列的左值。一個是實際陣列,另一個是假設的陣列陣列中的假設兄弟元素。在這種情況下,這些陣列隱式轉換為指向相應陣列的第一個元素的指標。
從技術上講,轉換后的指標之間的減法是未定義的,因為它們是指向單獨陣列元素的指標,因此可以說程式的行為是未定義的還有另一個原因。
但是讓我們假設這不是問題。將指向同一陣列的兩個元素的指標相減的結果產生了元素的距離。相鄰陣列的第一個元素之間的距離正好是第一個陣列中元素的數量。
為什么它應該是壞的。
請注意前面部分中說程式的行為未定義的部分。那很糟。
此外,您在理解它的作用時遇到了問題。那很糟。
獲取陣列大小的推薦方法是使用std::size(array).
uj5u.com熱心網友回復:
int代碼的邏輯是首先假設array2在array. 我說“假裝”是因為array2實際上并不存在。
基于這種偽裝,代碼的邏輯是;
&array是指向 的指標array。它具有型別int (*)[4](對人類來說更詳細地描述為“指向四個陣列的指標int”);&array 1是一個指標array2;- 取消參考該指標,即計算
*(&array 1)給出一個 (reference to)array2; - 在運算式
*(&array 1) - array中,術語*(&array 1)和array每個都隱式轉換為int *。這些指標的值分別是&array2[0]和&array[0]。所以運算式*(&array 1) - array等價于&array2[0] - &array[0]; - 由于
array2位于記憶體中的最后一個元素之后array,&array2[0]因此等于&array[4](即不存在的地址array[4])。減去兩個型別的指標int *給出它們之間的 s 的數量,int即&array[4] - &array[0]給出一個值4(型別std::size_t); - 由于
length具有 typeint,因此std::size_t具有 value4的內容將轉換為 int, i.e. to the value4`。
這就是(大概)您正在測驗的編譯器(或多個編譯器)正在使用的邏輯。
問題——即為什么人們認為它不好——是因為array2并且array[4]實際上并不存在。所以 - 根據標準 - 上面的第 3 步給出了未定義的行為。所有后續點(提到不存在array2或不存在array[4])也涉及未定義的行為。未定義行為的含義是標準沒有定義會發生什么 - 所以編譯器不需要實作代碼的邏輯。
一種在array不給出未定義行為的情況下獲得大小的方法很簡單length = sizeof(array)/sizeof(array[0]),因為sizeof運算子僅檢查其引數的型別(并且不評估它們),因此避免了未定義的行為。 sizeof(array)給出 4 的陣列的大小(以位元組為單位)int,并sizeof(array[0])給出單個 的大小(以位元組為單位)int,因此將它們除以4.
高級說明: 使用方法的局限性sizeof在于它在指標轉換的情況下不起作用。例如,如果array實際上是一個指標(如果將原始陣列作為引數傳遞給函式,則會發生這種情況),計算將不會(必然)給出4.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480184.html
下一篇:帶有布爾指標的奇怪C 輸出
