# 【C】陣列與指標
## Introduction
陣列為一種在記憶體空間**連續分布**的資料型態,陣列中的東西我們稱作**元素 ( element )**,陣列能夠透過元素的**索引 ( index )** 來取得資料
屬性整理如下
* 連續記憶體分布
* 為靜態的,不能改變大小
* 透過索引索取資料,索引時間複雜度 $O(1)$
## Array 在 `C` 語言中
以下為宣告陣列一個方式, `arr` 宣告成有 `5` 個元素的陣列,元素資料型態為 `int` ,在32/64位元系統底下,`int` 佔 `4 byte`,對於 `arr` 來說使用 `sizeof` 測量陣列大小時會輸出 `4 * 5 = 20 byte`。
```cpp
int arr[5] = {1, 2, 3, 4, 8};
printf("The arr have %d byte\n", (int)sizeof(arr));
printf("The array of address = %p\n", arr);
printf("The first element in array's address = %p\n", &arr[0]);
```
輸出如下,我們就看到了這個陣列佔 20 byte` 時輸出其地址,而這個地址是陣列的第一個元素的地址
```cpp
The arr have 20 byte
The array of address = 0061FF0C
The first element in array's address = 0061FF0C
```
## `arr` vs `&arr` 差異
在以下的程式中,兩種輸出的地址都是一樣的,但他們背後代表的資料型態是不一樣的!
```cpp
printf("arr = %p\n", arr);
printf("&arr = %p\n", &arr);
```
```cpp
arr = 0061FF0C
&arr = 0061FF0C
```
* `arr`
* 為陣列的第一個位置元素的地址,所以是 `arr[0] == arr`,如果要使用指標指向需要使用元素型態的指標,在這邊就需要使用 `int *p`
* `&arr`
* 代表的整個陣列的地址,其代表的意義為**整個陣列**其形態為 `int (*p)[]` , `p` 為指標,指向一個 `int []` 的陣列
```cpp!
int* ptr = arr;
int (*ptr2arr)[5] = &arr;
```
```cpp!
printf("Address of arr is %p\n", (void*)arr);
printf("Address of &arr is %p\n", (void*)&arr);
printf("Address of arr + 1 is %p\n", (void*)(arr + 1));
printf("Address of &arr + 1 is %p\n", (void*)(&arr + 1));
```
### arr + 1 vs &arr + 1
* `arr + 1` 代表從`arr[0] -> arr[1]`
* `&arr + 1` 代表從`int(*)[5] -> int (*)[5]`
```bash
Address of arr is 0061FF04
Address of &arr is 0061FF04
Address of arr + 1 is 0061FF08
Address of &arr + 1 is 0061FF18
```