当访问一个数组时,我们使用这样的操作符[]
:
int a[5];
...
a[b] = 12;
上述变量的正确数据类型是b
什么?
我发现这a[b]
等同于*(a + b)
,这让我觉得我想b
成为void*
或者size_t
但是,我不确定。
来自 C 标准(ISO/IEC 9899:TC2)第6.5.2.1 节数组下标
后缀表达式后跟方括号
[]
中的表达式是数组对象元素的下标指定。下标运算符的定义[]
与E1[E2]
相同(*((E1)+(E2)))
。由于适用于二元 + 运算符的转换规则,如果 E1 是数组对象(等效地,指向数组对象的初始元素的指针)并且E2 是整数,则E1[E2]
指定E2-th
元素 ofE1
(从零开始计数)。
其中一个a
和b
必须是指针,另一个必须是任何整数类型。一个证明如下。
由于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 条不区分 的操作数的顺序+
,因此它们可以是任意顺序。因此,其中一个a
和b
可能是指针,另一个是整数。
由于隐式转换,一些类型可以工作。
Achar
将晋升为int
。一个int
orunsigned int
也可以。short
或者unsigned short
也是有效类型。
即使a[b]
与 相同*(a + b)
,b
也不能是指针,因为a
已经是指针。二元运算符+
不接受两个指针。
b
被称为索引,它是一个数字。所以你可以把它当作整数来处理。a[b]
将访问b
数组的第一个元素a
。
*(a + b)
将赋予价值(a + (b * sizeof(data type of array element)))