C++ 为什么';t(&;array)[i]取第i个元素的地址?

C++ 为什么';t(&;array)[i]取第i个元素的地址?,c++,arrays,C++,Arrays,考虑以下代码 int tab2[2]; tab2[0]=5; tab2[1]=3; std::cout << tab2[1] << std::endl; std::cout << (&tab2)[1] << std::endl; int tab2[2]; tab2[0]=5; 表2[1]=3; std::cout它已经被“转换”为指针。您可以对数组或指针使用[]符号 (&tab2)意味着您可以获得数组的地址。。。在指针透视图中,它是指向指

考虑以下代码

int tab2[2];
tab2[0]=5;
tab2[1]=3;
std::cout << tab2[1] << std::endl;
std::cout << (&tab2)[1] << std::endl;
int tab2[2];
tab2[0]=5;
表2[1]=3;
std::cout它已经被“转换”为指针。您可以对数组或指针使用
[]
符号

(&tab2)
意味着您可以获得数组的地址。。。在指针透视图中,它是指向指针的指针(
**

因此,您正在尝试将变量(数组)转换为指针。好的,但是当指针指向数组的地址时,您尝试访问
[1]
元素,该元素当然不存在。。。这种表示法需要第二个数组。

此表达式:

(&tab2)[1]
获取指向2整数数组的指针。然后在指向数组的指针上使用数组语法,得到tab2之后的第1个2元素int数组

你的记忆里有吗

          tab2

          0         1   // index into tab2
          5         3   // values
你得到一个指向数组的指针

          0         1
 &tab2 -> 5         3
然后经过tab2,得到一个包含2个整数的数组

          0         1         2        3
 &tab2 -> 5         3         ?        ?
                             /|\
                              (&tab2)[1]

通过将地址(&)添加到tab2,您得到了tab2指针的内存地址,或指向指针的指针(int**)。所以从逻辑上说,是的,索引是有意义的。但是,&tab2与tab2不同&tab2指向指针itsefl,而tab2指向数组。通过使用1索引&tab2,您告诉它查看序列中的下一个元素,该元素不存在(或者它确实存在,但属于另一个变量)。如果您使用0对它进行索引,这将很好,因为您将查看内存序列的“根”

显然,只对tab2进行索引也很好,因为它指向一个数组。

当您使用
(&tab2)
时,您正在检索数组的地址。你的陈述本身就回答了你的问题。
如果您使用了
(*(&tab2))
,您将获得预期的输出-
3

是的,所以请尝试
&tab2[1]
,这也是相同的地址。实际上,和是不同的。这充其量是混淆的。。。或者根本不正确。OP询问的是
(&tab2)[1]
,而不是
&(tab2)[1]
。更重要的是,在
&tab2
中没有数组到指针的衰减,这个表达式的类型不是指针到指针,而是指向数组的指针
int(*)[2]
“因为tab2衰减到指针,所以您所做的就是获取衰减到指针的地址。”-不是真的,请参阅我上面的评论。