为什么不(& array)[i]取第i个元素的地址?

时间:2011-09-30 17:54:30

标签: c++ arrays

考虑以下代码

int tab2[2];
tab2[0]=5;
tab2[1]=3;
std::cout << tab2[1] << std::endl;
std::cout << (&tab2)[1] << std::endl;

正如我在其他主题中所读到的,数组可以衰减到第一个元素的指针。那么为什么[]对于上面代码中的tab2和&amp; tab2不起作用呢?有什么不同?

4 个答案:

答案 0 :(得分:3)

已经&#34;转换&#34;作为指针。您可以对数组或指针使用[]表示法......

(&tab2)表示您获取数组的地址...在指针透视图中,它是指向指针(**)的指针。

所以你试图将变量(它是一个数组)转换为指针。好的,但是你试着访问[1]元素,当然这个元素不存在,因为你的指针指向你的数组的地址......这样的符号会指望第二个数组。

答案 1 :(得分:3)

这个表达式:

(&tab2)[1]

获取指向2个int的数组的指针。然后在该指针到数组上使用数组语法,以获得tab2之后的第2个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]

答案 2 :(得分:2)

使用(&tab2)时,您正在检索阵列的地址。你的陈述本身就是你的问题。 如果你使用了(*(&tab2)),你就会得到你期望的输出结果 - 3

答案 3 :(得分:0)

你通过向tab2添加地址(&amp;)来完成你自己给出了tab2指针的内存地址,或指向指针的指针(int **)。所以逻辑上,是的,索引它是有道理的。但是,&amp; tab2与tab2不同。 &amp; tab2指向指针itsefl,而tab2指向数组。通过索引&amp; tab2为1,你已经告诉它查看序列中的下一个元素,它不存在(或者它确实存在,但属于另一个变量)。如果你用0索引它,这将是很好的,因为你会看到内存序列的“根”。

明确标记tab2也很好,因为它指向一个数组。