動態

詳情 返回 返回

C語言取數組地址a、& a、& a[0]三種方式的易錯分析 - 動態 詳情

  1. a 通過數組名可以直接獲得數組的地址
  2. &a 使用取地址符同樣也可以獲取數組的地址
  3. &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,但是結果卻不相等。

其實&aa&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就應該注意了。

有趣的坑我來踩,免費的關注點一個吧~

Add a new 評論

Some HTML is okay.