[英]memory cells and c++ pointers
我目前想知道有關c ++中的指針的一些信息。 例如,一個指針向我返回變量的內存地址。 所以如果說,我們想要一個整數的內存地址,通常我們有32位長度。
當我們說一個存儲單元的大小為1字節時,我需要4個存儲單元來存儲一個整數(4x8位= 32位)。 假設我有一個指針地址,如: 0x613c20
表示一個整數( int a = 10;
)。
當此地址指向整個內存中的4個單元之一時,為什么我將單元格僅增加+1時又得到另一個值? 我仍然會得到相同的值,因為我仍處於4個單元格之一內?
非常感謝你。
編輯:
我想我在第一篇文章中不太清楚:我並不是說我用pointer++
增加了指針;
我在調試器內部,僅通過添加+1來操縱Integer的內存地址,例如:
0x1-> 0x2。
因此,這意味着:
int a = 10;
*int b = &a; // 0x1
*0x1 -> 10
*0x2 -> 1203104
當Integer大小為4字節長時,為什么在這里我也不能得到10個字節?
當您遞增/遞減指針時,內存地址將被聲明為該指針的對象類型的長度“增加/減少”(例如,如果它是一個序列,它將指向相同類型的下一個/上一個對象相同類型的對象)
一個小例子:
#include <iostream>
using std::cout;
using std::endl;
int main()
{
int i = 5;
int* p_i = &i;
short c = 'a';
short* p_c = &c;
cout << "\npointer to int (4 bytes)\n";
cout << "adress: " << p_i << " ";
cout << "value: " << *p_i << endl;
++p_i;
cout << "adress: " << p_i << " ";
cout << "value: " << *p_i << endl;
++p_i;
cout << "adress: " << p_i << " ";
cout << "value: " << *p_i << endl;
++p_i;
cout << "adress: " << p_i << " ";
cout << "value: " << *p_i << endl;
++p_i;
cout << "\npointer to short (2 bytes)\n";
cout << "adress: " << p_c << " ";
cout << "value: " << *p_c << endl;
++p_c;
cout << "adress: " << p_c << " ";
cout << "value: " << *p_c << endl;
++p_c;
cout << "adress: " << p_c << " ";
cout << "value: " << *p_c << endl;
++p_c;
cout << "adress: " << p_c << " ";
cout << "value: " << *p_c << endl;
++p_c;
return 0;
}
以上代碼輸出:
pointer to int (4 bytes)
adress: 0x28ff24 value: 5
adress: 0x28ff28 value: 2686754
adress: 0x28ff2c value: 2686764
adress: 0x28ff30 value: 2686800
pointer to short (2 bytes)
adress: 0x28ff22 value: 97
adress: 0x28ff24 value: 5
adress: 0x28ff26 value: 0
adress: 0x28ff28 value: -216
如您所見,short的指針以2的步長“增加”,因為short占用2個字節的內存,而int則更長,占用4個字節(在我的系統上)。
我建議參考有關數據類型長度的文檔(它們在系統和編譯器之間可能會有所不同)和指針,以獲取更多信息。
您正在做的是指針運算。 將指針(不是值)加一的結果取決於指針的類型。 在您的示例中,實際地址不會增加1,而是增加4(或sizeof(int))。 而且,沒有這樣的事情
我仍然會得到相同的值,因為我仍然處於4個單元格之一內
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.