陣列為一種在記憶體空間連續分布的資料型態,陣列中的東西我們稱作元素(element),陣列能夠透過元素的索引(index) 來取得資料。
C
語言中以下為宣告陣列一個方式, arr
宣告成有 5
個元素的陣列,元素資料型態為 int
,在32/64位元系統底下,int
佔 4 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