指標可以視為一張寫著地址數字的小紙片

且上面有各自的編號 (*的個數)

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(小紙片)的抽屜(位址),它會發現裡面放了一張小紙片,接著它會去找小紙片上面寫的位址,並修改該位址的值

arrow
arrow
    全站熱搜

    大神(偽) 發表在 痞客邦 留言(0) 人氣()