访问数组时,我们使用运算符[]
,如下所示:
int a[5];
...
a[b] = 12;
上面变量b
的正确数据类型是什么?
我发现a[b]
相当于*(a + b)
,这让我觉得我希望b
为void*
或size_t
但是,我不确定。
答案 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)
a
和b
中的一个必须是指针,另一个必须是任何整数类型。证据如下。
由于a[b]
与每个2011年的(*((a)+(b)))
相同(n1570)6.5.2.1 2,a
和b
可以是任何类型,以便定义后一个表达式
根据6.5.3.2 2,一元*
运算符的操作数必须具有指针类型。因此,(a)+(b)
的结果必须具有指针类型。
根据6.5.6,二进制+
运算符接受各种类型的组合,但唯一产生指针类型的运算符是指针和整数的组合,如6.5.6中所述。 / p>
根据6.5.6 8,可以向指针添加整数,结果具有指针操作数的类型。条款6.5.6对+
的操作数的顺序没有区别,因此它们可以按任何顺序排列。因此,a
和b
可以是指针,另一个是整数。
答案 2 :(得分:0)
b
被称为索引,它是一个数字。因此,您可以将其作为整数处理。a[b]
将访问数组b
的{{1}}元素。
a
会在*(a + b)
答案 3 :(得分:0)
由于隐式转换,有些类型可以使用。
char
将被提升为int
。 int
或unsigned int
也会有用。 short
或unsigned short
也是有效类型。
即使a[b]
与*(a + b)
相同,b
也不能成为指针,因为a
已经是指针。二元运算符+
不接受两个指针。