我遇到了一段示例代碼,它使用指標和簡單的減法來使用 C 計算陣列中的專案數。
我已經運行了代碼并且它可以作業,但是當我在紙上進行數學計算時,我得到了不同的答案。
那里的解釋并沒有真正說明為什么這會起作用,我希望有人也能向我解釋這一點。
#include <iostream> using namespace std; int main() { int array[10] = {0, 9, 1, 8, 2, 7, 3, 6, 4, 5}; int stretch = *(&array 1) - array; cout << "Array is consists of: " << stretch << " numbers" << endl; cout << "Hence, Length of Array is: " << stretch; return 0; }
來自:https : //www.educba.com/c-plus-plus-length-of-array/
當我運行代碼時,我得到了數字 10。
當我列印的結果*(&array 1),并array通過
cout << *(&array 1) << endl; cout << array << endl;
我當然得到兩個十六進制地址。
當我減去這些十六進制數字時,我得到1C或28???
C 是否有可能實際上并沒有給出十六進制結果或將它們轉換為十進制,而是將這些數字視為地址,因此只回傳剩余的地址槽數?
如果有人擁有比我更多的知識來解釋這一點,那是我能得出的最接近的解釋,我將不勝感激。
uj5u.com熱心網友回復:
讓我們退后一步,一步一步來看看它是否會有所幫助。繼續我的評論,您遇到的問題是type 之一。
讓我們以陣列本身為例:
int array[10] = {0, 9, 1, 8, 2, 7, 3, 6, 4, 5};
在訪問時,陣列被轉換為指向陣列中第一個元素(例如第一個元素的地址)的指標,但需要注意這里不相關的注意事項。所以當你說array,你有型別int *,一個指向第一個元素的指標array。
現在當我取陣列的地址時會發生什么?(&array在)
int stretch = *(&array 1) - array;
當您獲取陣列的地址時,結果與 的地址相同array,但具有型別int (*)[10](指向陣列 的指標int[10])。當添加1到該指標(召回型對照指標運算),則用于指標的下一個陣列得到的地址int[10]在存盤器中之后array,這將是10 -int的第一個元素之后array。
因此,*(&array 1)為您提供int[10]after下一個陣列的地址array,然后僅需要取消參考以實作型別兼容性。當您取消參考 an 時,int (*)[10]您會留下int[10]- 訪問時會為您提供該陣列的第一個元素的地址(原始元素之后的一個)
仔細考慮型別,如果您有其他問題,請告訴我。
uj5u.com熱心網友回復:
您忘記了指標加法或減法如何作業的一個小細節。讓我們從一個簡單的例子開始。
int *p;
這是指向某個整數。如果使用您的 C 編譯器,ints 是四個位元組長:
p;
這不會將實際指標值增加 1,而是增加 4。指標現在指向下一個 int。如果查看實際的指標值,以十六進制表示,它會增加 4,而不是 1。
指標減法的作業方式相同:
int *a;
int *b;
// ...
size_t c=b-a;
如果在十六進制的差分值a和b是12,該減法的結果不會12,但3。
當我減去這些十六進制數時,我得到 1C 或 28 ???
你的減法一定有錯誤。您的結果應該是0x28, 或者40(很可能是您要求除錯器或編譯器進行減法運算,結果是十六進制的,并假設它是十進制的)。那將是int您要尋找的十個。
uj5u.com熱心網友回復:
我會嘗試 5 件物品
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int array[] {1,2,3,4,5};
int items= sizeof(array)/sizeof(array[0]);
cout << items << endl;
int items2 = *(&array 1) - array;
cout << items2 << endl;
cout << array << endl;
cout << *(&array 1) << endl;
return 0;
}
root@localhost:~/Source/c # g arraySize.cpp
root@localhost:~/Source/c # ./a.out
5
5
0x7fe2ec2800
0x7fe2ec2814
使用https://www.gigacalculator.com/calculators/hexadecimal-calculator.php將數字相減
我得到
14 十六進制
20 十進制。
適合 4 個位元組到一個整數。
謝謝伙計們:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/373605.html
標籤:C
