Try   HackMD

【C】陣列與指標

Introduction

陣列為一種在記憶體空間連續分布的資料型態,陣列中的東西我們稱作元素(element),陣列能夠透過元素的索引(index) 來取得資料。

  • 連續記憶體分布
  • 為靜態的,不能改變大小
  • 透過索引索取資料,索引時間複雜度
    O(1)

Array 在 C 語言中

以下為宣告陣列一個方式, arr 宣告成有 5 個元素的陣列,元素資料型態為 int ,在32/64位元系統底下,int4 byte,對於arr來說使用sizeof測量陣列大小時會輸出 4 * 5 = 20 byte

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` 時輸出其地址,而這個地址是陣列的第一個元素的地址

The arr have 20 byte
The array of address = 0061FF0C
The first element in array's address = 0061FF0C

arr vs &arr

在以下的程式中,兩種輸出的地址都是一樣的,但他們背後代表的資料型態是不一樣的!

printf("arr = %p\n", arr);
printf("&arr = %p\n", &arr);
arr = 0061FF0C
&arr = 0061FF0C
  • arr
    • 為陣列的第一個位置元素的地址,所以是arr[0] == arr,如果要使用指標指向需要使用元素型態的指標,在這邊就需要使用int *p
  • &arr
    • 代表的整個陣列的地址,其代表的意義為整個陣列其形態為int (*p)[]
int* ptr = arr;
int (*ptr2arr)[5] = &arr;
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));
  • ptr + 1 代表從arr[0] -> arr[1]
  • &arr + 1 代表從int(*)[5] -> int (*)[5]
Address of arr      is 0061FF04
Address of &arr     is 0061FF04
Address of arr + 1  is 0061FF08
Address of &arr + 1 is 0061FF18