- a 通過數組名可以直接獲得數組的地址
- &a 使用取地址符同樣也可以獲取數組的地址
- &a[0] 取數組首元素地址也可以取得數組的地址
#include <stdio.h>
int main(void) {
int a[6] = {1, 2, 3, 4, 5,6};
printf("a: %p\n",a);
printf("&a: %p\n",&a);
printf("&a[0]: %p\n",&a[0]);
}
/*
* a: 0061FF08
* &a: 0061FF08
* &a[0]: 0061FF08
*/
它們編譯輸出的值都是一模一樣的,看似沒有什麼問題,但是在實際的運算當中可能就會遇到一些意想不到的問題了,比如以下的代碼:
int main(void) {
int a[6] = {1, 2, 3, 4, 5, 6};
printf("a: %p\n",a); // 0061FF08
printf("&a: %p\n",&a); // 0061FF08
printf("&a[0]: %p\n",&a[0]); // 0061FF08
printf("a + 1: %p\n",a + 1);
printf("&a + 1: %p\n",&a + 1);
printf("&a[0] + 1: %p\n",&a[0] + 1);
}
給每一個地址都+1,a + 1,&a + 1,&a[0] + 1,進行一個簡單的地址運算,編譯輸出:
a: 0061FF08
&a: 0061FF08
&a[0]: 0061FF08
a + 1: 0061FF0C
&a + 1: 0061FF20
&a[0] + 1: 0061FF0C
這時候就會發現運算的結果並不一樣,為什麼&a + 1和其他兩個不相等呢?
明明取得的地址都是一樣的,都是+1,但是結果卻不相等。
其實&a和a、&a[0] 取地址是有區別的,雖然都可以取得相同的數組地址,但是它們類型並不相同。
&a 的類型是指向整個數組的指針,因此&a + 1將會指向整個數組的下一個位置,即a數組後面的內存空間。
a和&a[0] 的類型都是指向數組首元素的指針,因此a + 1、&a[0] + 1都會指向數組的下一個元素的地址,即a數組中的第2個元素的地址。
因此,雖然取得的數組地址相同,但是它們的步長不同,導致了指向的位置不同。
解析:
1.a 和 &a[0]取地址的類型是一樣的,a + 1 和 &a[0] + 1 ,都是指向數組中第2個元素的地址,第1個元素的地址是0061FF08,int型數組相相鄰元素地址之間相差4個字節,因此第2個元素的地址就是0061FF0C,這裏的步長是4。
2.&a是指向整個數組的指針,&a + 1會指向整個數組的下一個位置,因此步長應該是整個數組的大小,在這裏a數組的大小是24,數組地址0061FF08 + 24 ,最後算得0061FF20。
到這裏就已經真相大白......在實際的使用當中,我們應該分不同的情況選擇取數組地址的方式,通常都是使用a和a[0]的方式,這兩種方式一樣,如果使用&a就應該注意了。
有趣的坑我來踩,免費的關注點一個吧~