2012-08-17 55 views
1
int a[10]; 
printf("%p ", &a); 

将显示阵列a的地址。阵列和基地址重定向

因此,如果我执行重定向,*(&a),为什么我没有将价值存储在a[0]。 C语言的规则是什么,说我应该得到地址a。是的,这是有道理的,我得到的地址为a,因为*&将取消对方导致简单地a,这是a的地址。

回答

1

管理这个的C规则是C 2011 6.3.2.1 3:“除了它是sizeof运算符,_Alignof运算符或一元运算符的操作数,或者是用于初始化数组的字符串文字,具有类型为''的数组的表达式被转换为类型为''指向类型''的表达式,该表达式指向数组对象的初始元素并且不是左值。“

a是一个int数组。当您将a传递给printf时,规则将其转换为指向int的指针,并打印该指针的值。

当您将&a传递给printf时:首先,a&的操作数,所以该规则不适用; a未转换为指向int的指针;它仍然是一个int数组。其次,对&进行评估。 &a产生数组的地址,并打印这个地址。由于该数组的地址与其第一个元素的地址相同,因此将打印该地址。

请注意,表达式&a的类型是“指向int数组的指针”。因此,当您有*&a时,您正在将*应用于指向int数组的指针,结果是一个int数组。由于表达式是一个int数组,因此应用该规则,并将该数组的int转换为指向第一个元素的指针,并打印该指针的值。

2
int a[10]; 
printf("%p ", (void *) &a); // address of the array 
printf("%p ", (void *) a); // adress of the first element of the array 
printf("%p ", (void *) *(&a));// same as above 

这里,a值是一样的&a[0]。当a对象是int的数组时,值*&aa的值相同。

请注意,打印的地址将与它们在相同地址处开始的地址相同。

我添加了void *演员阵容,因为p需要一个void *参数。

+0

这表明在不回答提问者的规则是什么的情况下会发生什么。 – 2012-08-17 09:57:51

0

事实:

a[0] == *(a) 
a[9] == *(a+9) 
+0

这并不能解释为什么'*&a'与'&a'具有相同的值。在缺乏将数组转换为指针的特殊C规则的知识的情况下,令人惊讶的是当* a与a不具有相同的值时,*&a与'&a'具有相同的值。 – 2012-08-17 09:59:48

0

类型的指针的那个&a计算结果为是一个指针阵列(具体的指针int[10])。这是一种不同的类型,即指向数组的第一个元素的指针,即使它是相同的地址。

printf("%d ", *&a[0]);将打印数组的第一个元素的值,因为&a[0]的类型为int*