16.4 賦值pointers和references.
就像你看到使用“尋址”操作符的語法一樣,一個指針被賦值得到“尋 址”操作符的返回值。因為“尋址”操作符的返回值就是一個指針,所有事 情
都考慮過了,你的代碼應該通過編譯。對於賦值給一個指針,它必須在內存中得到一個地 址,不然編譯器將給你提示錯誤。
int x;
int* px = &x;
上 面一段代碼說明了被聲明為int類型的變量x,一個被聲明為指針的變量並給賦值內存中x的地 址。指針px實際上通過存儲在內存中x的地址“指向”x。記住當聲明一個指針時 ,需要同類型的指針在你所在地址中充當變量或常量。
現在這裡你開始明白指針和references的不同了。賦值一個指針給內存中的地址,你不得 不使用“尋址”操作符來返回指針變量在內存中的地址。
而一個references,不管怎樣,都不需要使用“尋址”操作符賦值成內存中的 地址。賦值一個地址給一個reference,你只需要使用變量充當rvalue值就行。int x;
int& rx=x;
上面代碼顯示類型int的變量x被聲明,然後reference rx也被聲明,並且被賦值“充當”x。注意不管x的地址是怎樣存儲在rx中,或者 說通過rx“被參考”,不必使用其他操作符,僅是變量。在你遇到必須聲明同類 型reference作為變量或常量的情況,你也必須遵循此類方法來充當指針。
有可能,你想知道一個指針能顯示什麼內容,就像這樣:#include <iostream.h>
int main()
{
int someNumber = 12345;
int* ptrSomeNumber = &someNumber;
cout << "someNumber=" << &someNumber <<endl;
cout << "ptrSomeNumber=" << prtSomeNumber <<endl;
return 0;
}
假如你編譯並運行此代碼,你應該會得到變量someNumber輸出 12345,ptrSomeNumber將輸出一個十六進制數(內存中地址都是以十六進制被實現的。)現在 ,如果你想輸出prtSomeNumber所指的值,你應該使用這些代碼:
#include <iostream.h>
int main()
{
int someNumber = 12345;
int* ptrSomeNumber = &someNumber;
cout << "someNumber=" << &someNumber <<endl;
cout << "ptrSomeNumber points to " << *prtSomeNumber <<endl;
return 0;
}
所以從原理上來說,當你想使用、修改或操作指針x所指的值 ,你就可以使用*x來充當此值或變量。
這裡有一個指針和referenceds能做的事的速查列表:
你能賦值指針來“指向”內存中的地址。
你能賦值reference來“充當”變量或常量。
你能復制指針值給其他指針。
你能分別修改指針或references所指或充當的,在內存中存儲的值。
你能對指針所指地址作遞增或遞減的操作。
你能傳遞指針和references給函數(更多信息見“通過reference傳遞”中可 找到)。
......待續。