int a[10];
printf("%p ", &a);
将显示阵列a
的地址。阵列和基地址重定向
因此,如果我执行重定向,*(&a)
,为什么我没有将价值存储在a[0]
。 C语言的规则是什么,说我应该得到地址a
。是的,这是有道理的,我得到的地址为a
,因为*
和&
将取消对方导致简单地a
,这是a
的地址。
int a[10];
printf("%p ", &a);
将显示阵列a
的地址。阵列和基地址重定向
因此,如果我执行重定向,*(&a)
,为什么我没有将价值存储在a[0]
。 C语言的规则是什么,说我应该得到地址a
。是的,这是有道理的,我得到的地址为a
,因为*
和&
将取消对方导致简单地a
,这是a
的地址。
管理这个的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转换为指向第一个元素的指针,并打印该指针的值。
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
的数组时,值*&a
与a
的值相同。
请注意,打印的地址将与它们在相同地址处开始的地址相同。
我添加了void *
演员阵容,因为p
需要一个void *
参数。
事实:
a[0] == *(a)
a[9] == *(a+9)
这并不能解释为什么'*&a'与'&a'具有相同的值。在缺乏将数组转换为指针的特殊C规则的知识的情况下,令人惊讶的是当* a与a不具有相同的值时,*&a与'&a'具有相同的值。 – 2012-08-17 09:59:48
类型的指针的那个&a
计算结果为是一个指针阵列(具体的指针int[10]
)。这是一种不同的类型,即指向数组的第一个元素的指针,即使它是相同的地址。
printf("%d ", *&a[0]);
将打印数组的第一个元素的值,因为&a[0]
的类型为int*
。
这表明在不回答提问者的规则是什么的情况下会发生什么。 – 2012-08-17 09:57:51