在c++中访问2D数组的起始元素

accessing the starting element of 2D array in C++

本文关键字:元素 数组 2D c++ 访问      更新时间:2023-10-16

我看到了这段代码。在cout语句中,条件的计算结果为true。

   a[10][10]=’h’;
   cout<<(a[0]==*a)&&(*a==0[a]);

使用0[a]访问数组元素/地址是新事物。谁能解释一下这种符号?

From http://c-faq.com/aryptr/joke.html

问:我遇到了一些包含表达式5["abcdef"]的笑话代码。这怎么可能合法?

A:是的,Virginia,数组下标在c中是可交换的。[脚注]这个奇怪的事实是从数组下标的指针定义中得出的,即A [e]等于*((A)+(e)),对于任意两个表达式A和e,只要其中一个是指针表达式,一个是积分表达式。"证明"看起来像

a[e]
*((a) + (e))    (by definition)
*((e) + (a))    (by commutativity of addition)
e[a]        (by definition)

这种不可预料的交换性经常在C文本中被提及,好像它是一件值得骄傲的事情,但它在混淆C竞赛之外没有任何有用的应用(见问题20.36)。

由于C中的字符串是char数组,表达式"abcdef"[5]是完全合法的,计算结果为字符'f'。你可以把它看作

的简写
char *tmpptr = "abcdef";
... tmpptr[5] ...

在C中,0[a]a[0]具有完全相同的含义,两者都等价于*a。参见C常见问题解答。

只要a是指针,所有这些表达式在c++中都具有与C中相同的语义。

假设a是指向对象的指针,这些表达式总是相同的:

*a
0[a]
a[0]

这意味着这些表达式(a[0]==*a)(*a==0[a])也是相同的,并且都求值为1