考虑以下代码
int tab2[2];
tab2[0]=5;
tab2[1]=3;
std::cout << tab2[1] << std::endl;
std::cout << (&tab2)[1] << std::endl;
正如我在其他主题中所读到的,数组可以衰减到第一个元素的指针。那么为什么[]对于上面代码中的tab2和&amp; tab2不起作用呢?有什么不同?
答案 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也很好,因为它指向一个数组。