运算符[]的输入数据类型是什么?

时间:2013-07-23 13:03:37

标签: c arrays memory

访问数组时,我们使用运算符[],如下所示:

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

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

我发现a[b]相当于*(a + b),这让我觉得我希望bvoid*size_t但是,我不确定。

4 个答案:

答案 0 :(得分:5)

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

  

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

答案 1 :(得分:4)

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

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

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

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

根据6.5.6 8,可以向指针添加整数,结果具有指针操作数的类型。条款6.5.6对+的操作数的顺序没有区别,因此它们可以按任何顺序排列。因此,ab可以是指针,另一个是整数。

答案 2 :(得分:0)

b被称为索引,它是一个数字。因此,您可以将其作为整数处理。a[b]将访问数组b的{​​{1}}元素。

a会在*(a + b)

给出价值

答案 3 :(得分:0)

由于隐式转换,有些类型可以使用。

char将被提升为intintunsigned int也会有用。 shortunsigned short也是有效类型。

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