現有一段程式如下:
#include <iostream>
using namespace std;
int main() {
int p = 10;
int *ptr1 = &p;
int **ptr2 = &ptr1;
cout << "p的值:" << p << endl;
cout << "p的記憶體位置: " << &p << endl;
cout << endl;
cout << "*ptr1 = " << *ptr1 << endl;
cout << "ptr1 = " << ptr1 << endl;
cout << "ptr1的記憶體位置: " << &ptr1 << endl;
cout << endl;
cout << "**ptr2 = " << **ptr2 << endl;
cout << "*ptr2 = " << *ptr2 << endl;
cout << "ptr2 = " << ptr2 << endl;
cout << "&ptr2 = " << &ptr2 << endl;
cout << endl;
return 0;
}
指標這種東西,邏輯是一定的,但理解的方式則看個人,提供我的理解方式如下:
int p=10,意思就是把10這個值assign給p,因為是存在記憶體中,所以會有個address,假設是0xa。
再來是取值(*)與取址(&)的問題。int p = 10,表示p的值是10,想知道在記憶體的位址,就用&p,即0xa。
使用pointer的情況如下: int *ptr1=&p。*ptr1表示ptr1是一個整數指位器,宣告成指位器,所以要assign一個address給它。此例給他p的address: &p。
規則是不看取值"*"這個符號,不管他有幾個。要取值時,一層層加上"*",然後看該位址所指的值。
例如: 若p1=0xa, 則*p1就是0xa所指的值。若*p1=0xb, 賺**p1就是0xb所指的值
因此,ptr1存入0xa,也就是&p。ptr1本身也有address: &ptr1,假設是0xb。*ptr1表示ptr1這個位址 (0xa) 其指到的值,那就是10。
再來是你指完換我指,我指完你再指 -- 指位器的指位器
int **ptr2=&ptr1。跟前述一樣,指位器的指位器他還是個指位器,就像乞丐中的霸主他還是個乞丐一樣,給他一個address,此例為&ptr1。
一樣不看"**"的部分。所以ptr2就是&ptr1,也就是0xb。*ptr2就是0xb這個位址所含的值,就是0xa。**ptr2就是0xa這個位值所含的值,就是10了。
取址也一樣&ptr2,假設是0xc。
寫到這邊,我自己也不知道在寫什麼,看的懂我輸你100萬。不過,用來應付面試應該是足夠了。
示意圖
執行結果
p的值:10
p的記憶體位置: 0xbf9e612c (0xa)
*ptr1 = 10
ptr1 = 0xbf9e612c
ptr1的記憶體位置: 0xbf9e6128 (0xb)
**ptr2 = 10
*ptr2 = 0xbf9e612c
ptr2 = 0xbf9e6128
&ptr2 = 0xbf9e6124 (0xc
寫錯留言給我,沒上不要怪我。
留言列表