2014-09-01 72 views
2

下面是一段代碼,我已經寫了:指向數組的指針derefferencing

#include <stdio.h> 
void main() 
{ 
    int (*p)[2]; 
    int a[2] = {0, 1}; 
    p = &a; 
    printf("p = %x\n",p); 
    printf("&p = %x\n",&p); 
    printf("a = %x\n",a); 
    printf("&a = %x\n",&a); 
    printf("*p = %x\n",*p); 
    printf("*a = %x\n",*a); 
} 

下面是我得到的輸出:

p = bfd387c8 
&p = bfd387c4 
a = bfd387c8 
&a = bfd387c8 
*p = bfd387c8 
*a = 0 

現在我有這樣的懷疑,怎麼可能p和* p是相等的。其實p = a;*a = 0; 那麼爲什麼* p也不等於0。請這是我的第一個問題在堆棧 overflow.Please幫助我。

+0

你指'INT * P [2];'代替'INT(* P)[2];'? – Sathish 2014-09-01 09:39:17

+1

順便說一句,你應該使用'%p'來打印一個指針的值。 – chrk 2014-09-01 09:43:17

+0

'** p == * a == 0'。 – Nelfeal 2014-09-01 09:53:29

回答

3

你的程序應該是這樣的:

#include <stdio.h> 
int main() 
{ 
    int (*p)[2]; 
    int a[2] = {0, 1}; 
    p = &a; 
    printf("p = %p\n",(void*)p); 
    printf("&p = %p\n",(void*)&p); 
    printf("a = %p\n",(void*)a); 
    printf("&a = %p\n",(void*)&a); 
    printf("*p = %p\n",(void*)*p); 
    printf("*a = %x\n",*a); 
    printf("**p = %x\n",**p); 
    return 0; 
} 

您應該使用%p和轉換爲(void*)打印指針。

p指向數組a(這意味着a == &a)等p == *p。要獲得數組的第一個值,您必須使用**p,因爲它是一個指向數組的指針。

+0

好吧,但爲什麼我應該做一個(void *)來打印這個地址。好的,在此先感謝。 – Akhil 2014-09-01 11:03:24

+0

,因爲'%p'需要一個指向void的指針。 – mch 2014-09-01 11:52:29

+0

,因爲'(* p)[0]'是第一個值,而'p [0]'是指向數組的指針。 'p [0]'與'* p'和'p'具有相同的值,全部3指向數組或數組的第一個值。 – mch 2014-09-01 16:39:54

1

除了當它是sizeof或一元&運營商的操作數,或是一個字符串被用來初始化一個聲明另一個數組,類型「的T N元件陣列」的表達將被轉換(」衰減「)轉換爲類型爲」指向T的指針「的表達式,並且該表達式的值將是該數組的第一個元素的地址。

在聲明的陣列,它的佈置在存儲器像這樣:

  +---+ 
    arr[0]: | | 
      +---+ 
    arr[1]: | | 
      +---+ 
      ... 
      +---+ 
arr[N-1]: | | 
      +---+ 

注意,沒有單獨的arr變量來存儲陣列的第一個元素的地址;第一個元素的地址與整個數組的地址相同。

因此,值表達式的arr&arr是相同的,但類型是不同的(對比T *T (*)[N])。

由於p的計算結果爲&a*p的計算結果爲a,並且由於&aa產生相同的值,則p*p也將產生相同的值。

(*p)[0] == a[0] == *a == 0