# [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++程式語言觀念`