2010-09-05 68 views
1
#include<stdio.h> 
int main(void) { 
int arr[3]={1,2,3}; 
return 0; 
} 

現在*(&arr)會給我什麼,爲什麼?我想要一個詳細的解釋。不要只是告訴我如何取消*&:P引用地址?

我想知道編譯器如何解釋此表達式以給出所需的結果。

回答

6

&arr創建一個指向該數組的指針 - 它的類型爲int (*)[3],並指向數組arr

*&arr解除引用指針 - 它是數組本身。現在,現在發生的事情取決於你用它做了什麼。如果使用*&arr如任一sizeof&運營商的主題,則它分別給出陣列的大小或地址:

printf("%zu\n", sizeof *&arr); /* Prints 3 * sizeof(int) */ 

但是,如果在任何其他上下文中使用它,然後將其作爲評價一個指向它的第一個元素:

int *x = *&arr; 
printf("%d\n", *x); /* Prints 1 */ 

換句話說:*&arr行爲酷似arr,如你所願。

+0

好吧,如果我說printf(「%d」,* &arr);它只是給了我&arr [0],第一個元素的地址,當你說它創建一個指針時,它是物理創建的嗎? – n0nChun 2010-09-05 10:10:38

+2

它「創建它」的方式與評估'2 + 3''創建'int'值'5'相同。 – caf 2010-09-05 10:16:51

-1

由於arr是靜態分配的陣列,而不是一個指針可變 - 表達&arr相當於arr。因此*(&arr)實際上是*arr

如果arr是一個指針,事情會有所不同。

+0

arr不等於&arr。 – mhshams 2010-09-05 10:10:05

+0

這是不正確的。*(&arr)'是相同的作爲'arr',顯然*不與* arr相同。 – caf 2010-09-05 10:17:51