定義: 指針是一個整數,一種存儲記憶體地址的數字 記憶體就像一條線性的線,在這條街上的每一個房子都有一個號碼和地址 類似比喻成電腦,這條街上每一個房子的地址 是一個位元組 我們需要能夠準確找到這些地址的方法,用來讀寫操作 因此,指針就是這些地址。不要考慮類型,無論是什麼類型的指針,都是用來保存地址的整數。 ...
定義:
指針是一個整數,一種存儲記憶體地址的數字
- 記憶體就像一條線性的線,在這條街上的每一個房子都有一個號碼和地址
- 類似比喻成電腦,這條街上每一個房子的地址 是一個位元組
- 我們需要能夠準確找到這些地址的方法,用來讀寫操作
因此,指針就是這些地址。不要考慮類型,無論是什麼類型的指針,都是用來保存地址的整數。
使用
int main() {
void* ptr = nullptr;
}
表示不在乎類型的空指針,我們無法對空指針進行讀取和寫入
int main() {
int var = 8;
void* ptr = &var;
}
用&符號取得var的地址,並賦給ptr
對程式進行Debug,可以得到var的值為8
,ptr的的值是0xfd183ffcc4
,本文使用的clion,在memory中輸入,可以被帶到記憶體區域。
總結來說,它本身不保存所謂變數的數字,指針就是一個保存地址的數,僅此而已
解引用
在指針前增加
*
可以進行解引用。
int main() {
int var = 8;
void* ptr = &var;
*ptr = 10;
}
上述代碼有錯誤,因為將10賦值給*ptr
後,記憶體不知道該分配多少位元組,是4?還是8?……
這時候就需要類型了,用來告訴編譯器,他需要多少位元組
int main() {
int var = 8;
int* ptr = &var;
*ptr = 10;
std::cout << var << std::endl; // 結果為10
}
可以看到編程0a,0a是十六進位的10
堆上創建
int main() {
char* buffer = new char[8];
//對指針進行操作
delete[] buffer;
}
- 我們知道
char
是1byte,上面這句話是告訴編譯器,給我分配8個位元組的記憶體, - 與此同時,返回了一個叫
buffer
的指針指向那塊記憶體的開始位置。 - 在最後,我們需要使用
delete[] buffer
來刪除指針。
指針的指針
int main() {
char* buffer = new char[8];
char** ptr = &buffer;
delete[] buffer;
std::cin.get();
}
簡單來說指針的指針,就是定義一個新的指針,用來指向指針的地址。