C++ Pointers 教學
最近開始重新摸一下C++語言,畢竟打好根基是很重要的。
我個人是比較喜歡看書,所以我推介大家去讀這本《C++ Primer》來學C++ (我個人是用5th Edition)。
今天來談一下Pointer,這個所有Programmer都討厭的東西。
為什麼?因為Pointer通常難以理解,即使是有經驗的Programmer也常常因為調試Pointer引發的Error而備受折磨。
既然說到 Pointer, 就不得不先談一下 Reference(引用)。
Reference(引用)
Reference是為對象起另外一個名字,引用類型引用(refers to)另外一種類型。
每個引用的Variable名字都必須以 & 開頭。
來看一個小例子:
1 | int ival = 1024; |
這和我們平時宣告Variable有何不同?
宣告Variable時,初始值會Copy到新建對象。
1 | int val1 = 69; |
宣告Reference時,引用會和它的初始值綁到一起(bind),而不是Copy。
1 | int val1 = 69; |
TL:DR
Reference gave another name of an existed object.
They are still the same object.
注意 :引用必須要被初始化!
錯誤示範:
1 | int &refVal2; //Error : 引用必須要被初始化。 |
注意 :引用的類型必須要和對象的類型一樣!
用剛才的例子改一下:
1 | double ival = 1024; |
來個簡潔的程序示範
1 |
|
Pointer(指針)
Pointer(指計)是程式語言中的一類資料類型及其物件或變數,用來表示或儲存一個記憶體位址,這個位址的值直接指向(points to)存在該位址的物件的值。
每個的Variable名字都必須以 * 開頭。
來看一個小例子:
1 | int *ip1, ip2; //ip1 是 指向 int 型對象的 Pointer, ip2 是個 int 型對象。 |
Pointer需要用到new嗎?
為什麼人們用Pointer會用到new?
Address(地址)
Pointer存放在某個對象的Address(地址)。要想獲取對應的Address,需要使用到取地址符(和Reference(引用)一樣用 &)
1 | int ival = 42; |
注意 :指針的類型必須要和對象的類型一樣!
1 | double dval; |
指針的其他操作
Pointer是可以用 == 和 != 來做比較的。
1 | int ival = 1024; |
void* 指針
void*指針可用於存放住意對象的地址,但我們不知道地址中是什麼類型的對象。
通常用於pointer間的比較,function input and output。
1 | double obj = 3.14, *pd = &obj; |
指向指針的指針
1 | int ival = 1024; |
ppi->pi->ival
引用和Const
1 | const int ci = 1024; |
對const引用
1 | int i = 42; |
想一想下面的例子,會不會有Error?
1 | double dval = 3.14; |
是沒有Error的。
留意ri是引用了一個int的數,而這裹dval是double。
為了確保ri綁定一個整數,Compiler會把上面的code變成這樣:
1 | const int temp = dval; //轉double去int |
ri綁定了一個temporary的對象。所以最後ri的值是3。
1 | int i = 42; |
指針和Const
指向Const的指針 (Pointer to Const)
和引用大致一樣。指向Const的Pointer是不能用於改變其所指對象的值。
指針的類型一定要和所指的對象一致。
Pointer type must match with the pointed object.
1 | const double pi = 3.14; |
指向Const的Pointer只要求我們不可以用Pointer去改變對象的值,
但沒有說過那個對象的值不能通過其他方式去改變。
Const指針 (Const Pointer)
Const pointer 一定要initialize, 而且initialize後存放在pointer中的address就不能再改變了。
把*放在const前面用以說明Pointer是個const,即不變的是Pointer的值而不是指向的那個值。
1 | int errNumb = 0; |
順便分享一下Lynn姐的淺顯易懂C語言指標教學