---
# System prepended metadata

title: '[C++] 指標與陣列(Pointer & Array)'
tags: [' C/C++程式語言觀念']

---

# [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;
}

```

![](https://i.imgur.com/FO6Xszt.png)


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;
}

``` 
![](https://i.imgur.com/xP2L7xk.png)

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