# 【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 ```