我有點亂用指標。請看下面的結果(地址)。
第一個代碼:
#include <iostream>
int main(){
int a = 5;
void* pointer = &a;
std::cout << a << std::endl << &a << std::endl;
std::cout << pointer << std::endl ;
std::cin.get();
}
結果:

第二個代碼:
#include <iostream>
int main(){
int a = 5;
void* pointer = &a;
std::cout << a << std::endl << &a << std::endl;
std::cout << &pointer << std::endl ;
std::cin.get();
}
結果:

為什么變數的地址a在兩個代碼之間變化?
uj5u.com熱心網友回復:
在第一種情況下,您永遠不會獲取 的地址pointer,因此pointer可以存盤在暫存器中,甚至根本不存盤。(現代編譯器非常聰明,現代機器有很多暫存器。)
例如,gcc 11 將值保存在暫存器中,沒有優化,直接-O2插入地址a。(在這里組裝,為了好奇。)
在第二種情況下,您確實獲取了 的地址pointer,因此它必須存盤在記憶體中的某個位置。
這意味著a可能會將其存盤在不同的地方以便為它騰出空間。
此外,一些平臺隨機化存盤位置以降低程式的可破解性,因此假設事物在不同的“運行”中具有相同的地址通常不是一個好主意。
uj5u.com熱心網友回復:
在第一個代碼中poiner存盤變數的地址a,并通過命令。
std::cout<<pointer<<std::endl;
您列印 的地址a。就是這樣。第二個代碼中pointer也存盤了變數的地址a,不過&pointer是變數的地址pointer。嘗試以下
#include <iostream>
int main(){
int a = 5;
void* pointer = &a;
void** pointer_to_pointer = &pointer;
std::cout << a << std::endl << &a << std::endl << pointer << std::endl;
std::cout << &pointer << std::endl << pointer_to_pointer;
std::cin.get();
}
我的輸出是
5
0x7aba1bd92e94
0x7aba1bd92e94
0x7aba1bd92e98
0x7aba1bd92e98
uj5u.com熱心網友回復:
這很簡單。
int a和void* pointer是兩個不同的變數,或者我最好說堆疊上的記憶體位置。a在它的位置保存一個像 5 這樣的值。pointer保存地址 toa的記憶體位置。pointer本身存盤在不同的位置,當您撰寫std::cout << &pointer << std::endl;它時,它將列印pointer變數的地址,而不是它的內容,即a的地址。
作為一個簡化的例子:
將0x4視為pointer自身的地址,其中的值為0xC。該值指向a的位置。為了讀取a(5)的值,您首先必須到0x4讀取其內容。它的內容是0xC,現在您已經成功地發現它a的位置是0xC。然后你必須去0xC,在那個地址,你會發現值 5。
你看 -> 0x4 ( content == 0xC ) -> 0xC ( content == 5 ) -> 完成!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/356248.html
上一篇:如果c=='\0'函式Strrchr如何找到最后一個c?
下一篇:索引運算子對任意指標有什么作用?
