2010-09-05 65 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