指標可以視為一張寫著地址及數字的小紙片
且上面有各自的編號 (*的個數)
EX: *ptr 編號為1 , **ptr 編號為2 依此類推
故,一個指標有兩個位址一個值
兩個位址: 存放小紙片的位址(指標的位址)及小紙片上面寫的位址(指標指到的位址)
一個值: 視形態而定
int* 指標的值為整數
char* 指標的值為字元
string* 指標的值為字串
......等
首先,我們先來談談只有一個*的指標
1.記憶體配置情形
int *ptr = NULL; //宣告一張編號為1的"空白"小紙片
cout << &ptr << endl; //印出小紙片所在的位址,會因電腦不同而不同
cout << ptr << endl; //印出小紙片上面寫的位址,因為前面宣告時設定為NULL,故小紙片上面並未寫下任何位址
輸出結果:
0x6afefc
0
2.設定指標指到的位址(即在小紙片上寫下想指到的位址)
ptr = &addr1; //在小紙片上寫下addr1的位址
cout << ptr << endl; //印出小紙片上寫的位址
cout << &addr1 << endl; //印出addr1的位址
輸出結果:
0x6afef8
0x6afef8
發現了嗎? 小紙片上寫的位址即為addr1的位址
3.藉由指標修改addr1的值(即修改小紙片上所寫的位址的值)
cout << addr1 << endl; //印出修改前addr1的值
*ptr = 3; //將小紙片上所寫的位址的值改成3
cout << addr1 << endl; //印出修改後addr1的值
輸出結果:
1
3
test
1.試問在上面的程式中,總共宣告了幾個位址?
2.為什麼我們可以藉由指標修改其他記憶體位址的值?
ans
1. 2個 分別是ptr(小紙片)的位址和addr1的位址
2. 因為程式會先去開存放ptr(小紙片)的抽屜(位址),它會發現裡面放了一張小紙片,接著它會去找小紙片上面寫的位址,並修改該位址的值
留言列表