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

时间:2013-01-05 14:22:11

标签: c++ arrays pointers

我遇到了这段代码。在cout语句中,条件评估为true。

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

使用0[a]访问数组元素/地址是新事物。 有人可以解释一下这种表示法吗?

3 个答案:

答案 0 :(得分:3)

来自http://c-faq.com/aryptr/joke.html

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

答:是的,弗吉尼亚州,数组下标在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] ...

答案 1 :(得分:2)

在C中,0[a]a[0]具有完全相同的含义,两者都等同于*a。请参阅C FAQ

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

答案 2 :(得分:2)

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

*a

0[a]

a[0]

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