4

当访问一个数组时,我们使用这样的操作符[]

int a[5];
...
a[b] = 12;

上述变量的正确数据类型是b什么?

我发现这a[b]等同于*(a + b),这让我觉得我想b成为void*或者size_t但是,我不确定。

4

4 回答 4

5

来自 C 标准(ISO/IEC 9899:TC2)第6.5.2.1 节数组下标

后缀表达式后跟方括号[]中的表达式是数组对象元素的下标指定。下标运算符的定义[]E1[E2]相同(*((E1)+(E2)))。由于适用于二元 + 运算符的转换规则,如果 E1 是数组对象(等效地,指向数组对象的初始元素的指针)并且E2 是整数,则E1[E2]指定E2-th 元素 of E1(从零开始计数)。

于 2013-07-23T13:11:06.967 回答
4

其中一个ab必须是指针,另一个必须是任何整数类型。一个证明如下。

由于a[b](*((a)+(b)))每 C 2011 (n1570) 6.5.2.1 2 相同,a并且b可以是任何类型,以便定义后一个表达式。

根据 6.5.3.2 2,一元运算*符的操作数必须具有指针类型。因此,结果(a)+(b)必须是指针类型。

根据 6.5.6,二元+运算符接受各种类型的组合,但产生指针类型的唯一一种是指针和整数的组合,如 6.5.6 8 中所述。

根据 6.5.6 8,可以将整数添加到指针,结果具有指针操作数的类型。第 6.5.6 条不区分 的操作数的顺序+,因此它们可以是任意顺序。因此,其中一个ab可能是指针,另一个是整数。

于 2013-07-23T13:24:57.367 回答
0

由于隐式转换,一些类型可以工作。

Achar将晋升为int。一个intorunsigned int也可以。short或者unsigned short也是有效类型。

即使a[b]与 相同*(a + b)b也不能是指针,因为a已经是指针。二元运算符+不接受两个指针。

于 2013-07-23T13:09:01.877 回答
0

b被称为索引,它是一个数字。所以你可以把它当作整数来处理。a[b]将访问b数组的第一个元素a

*(a + b)将赋予价值(a + (b * sizeof(data type of array element)))

于 2013-07-23T13:05:39.410 回答