# [C++] 指標與陣列(Pointer & Array) 程式語言就是跟電腦描述如何處理資料,所以要充分瞭解每個程式語言對資料型態的定義,C/C++因為更貼近記憶體的運作來設計,所以很多觀念在描述上略為抽象,在學習上需要格外費心。 建議手繪來幫助記憶。 ## 複合資料型別 (compound type) 相較於基本型別int, double,C++還有一種複合資料型別。 其中很重要,會常用到的複合資料型別,就是參考(reference)、指標(pointer)、陣列(Array) ### 參考(Reference) 1. 參考的定義 ``` C++ #include <iostream> using namespace std; int main() { int i = 1, j = 2; int &r = i; //i is referenced by r cout << "address of r: " <<&r << endl; cout << "address of i: " <<&i << endl; return 0; } ```  2. 參考本身不是一個物件,而是對於一個**已存在物件**取別的名稱 ### 指標(Pointer) 1. 指標本身是一個物件,指向任何一個**已存在物件**,可以被指定或拷貝 - 指標宣告時,就要定義是指向哪種資料型態的物件 - 指標本身儲存的值,有三種情況 - 指向一個物件,值裡面存放另一個物件的位址 - 指向另一個物件尾端後的位置 - 沒有指向任何物件,值即為null ``` C++ int i = 42; int *p = &i; //p指向i ``` 2. 當一個指標指向一個物件,我們可以使用解參考(dereference)運算子*來存取物件 ``` C++ #include <iostream> using namespace std; int main() { int i = 42; int *p = &i; //p指向i cout << *p << endl; //印出指標p所指向物件i的值,即42 *p = 0; //因為p指向i,所以實際是i的值被改變成0 cout << i <<endl; //印出指標p所指向物件i的值,即0 return 0; } ``` 3. 關鍵觀念:*, &的符號多重意義 ``` C++ #include <iostream> using namespace std; int main() { int i = 42; int &r = i; //& 跟在一個型別,且是宣告的一部份,所以r是一個reference int *p; //* 跟在一個型別,且是宣告的一部份,所以p是一個pointer p = &i; //& 被用在運算式中,做為address-of 運算子 *p = i; //* 被用在運算式中,做為dereference運算子 int &j = *p; //& 是宣告的一部分;* 是dereference運算子 cout << "i: " << i << endl; cout << "&i: " << &i << endl; cout << "r: " << r << endl; cout << "&r: " << &r << endl; cout << "*p: " << *p << endl; cout << "p: " << p << endl; cout << "j: " << j << endl; cout << "&j: " << &j << endl; return 0; } ```  4. void*指標:型別void*是一個特殊的指標型別,可以存放任何物件的位址 ### 陣列(Array) 1. 陣列的定義:是一個複合資料型別,放置**單一型別**物件的容器,並且以位置來存取它們,有固定的尺寸 2. 宣告與初始化陣列 ``` C++ int a[10]; //宣告一個10個int物件的陣列 int *p[10]; //宣告一個10個int指標的陣列 ``` 3. 指標算術 對一個指標做加減,會移動指向陣列中的位置 ``` C++ #include <iostream> using namespace std; int main() { int a[] = {1,2,3,4,5}; int *ip = a; //等同於int *ip = &a[0] int *ip2 = ip + 4; //ip2指向a[4] cout << ip2 << endl; return 0; } ``` ## 參考資料 C++ Primer 5th version - CH2.3 複合型別 - CH3.5 陣列 ###### tags: ` C/C++程式語言觀念`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up