数组索引和地址返回相同的值

5
#include<stdio.h>
int main(void) {
  int a[3] = {1,2,3};
  printf("\n\t %u %u %u \t\n",a,&a,&a+1);
  return 0;
}

现在我不明白为什么 a 和 &a 返回相同的值,这背后的原因和实际应用是什么?&a 的类型是什么,并且我能否使用 &(&a)?

1个回答

10
现在我不明白为什么a和&a返回相同的值,其中的原因是什么。 a是数组的名称,它会衰减为指向该数组第一个元素的指针。 &a只是数组本身的地址,虽然a&a打印出相同的值,但它们的类型不同。
同时,&a的类型是什么?
指向包含三个int的数组的指针,即int (*)[3]
我能像这样做吗 &(&a)?
不行,地址运算符要求其操作数为lvalue(可修改的左值)。数组名是不可修改的lvalue,因此&a是合法的,但&(&a)则不合法。
打印&a的类型(仅限C++):
#include <typeinfo>
#include <iostream>

int main()
{
   int a[]={1,2,3};
   std::cout<< typeid(&a).name();
}

附言:

在打印地址时,请使用%p格式说明符(在printf中使用不正确的格式说明符会引发未定义行为)。


2
@n0nChun:对于一个类型为T的n个元素的数组,第一个元素的地址类型为“指向T的指针”;整个数组的地址类型为“指向类型为T的n个元素的数组的指针”。 - Prasoon Saurav
1
谢谢。我也找到了这个:) http://publications.gbdirect.co.uk/c_book/chapter5/arrays_and_address_of.html - n0nChun
2
@n0nChun:如果你写了 int i;,那么你并没有将 i 声明为指向 int 的指针,但是 &i 是一个指向 int 的指针 ;) - fredoverflow
我还需要问一件事情。 如果你说 int a[3] = {1,3,4}; int *p; p = &a;那么 p 是 int,而 &a 是 int()[3],不是类型不匹配吗? 但它可以通过编译器。 - n0nChun
@Prasoon:我不同意a和&a是同一件事。a是该数组的基地址,而&a表示基地址的地址。假设基地址为ff01,则&a将给出内容为ff01的地址。 - user379888
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接