我是处理结构的新手,特别是结构数组。
我想知道这是否正确。
(*(data+i)).member == data[i].member ?
答案 0 :(得分:5)
是的,两者保证是等价的。特别是,C语言标准根据指针算法定义了数组下标data[i]
- data[i]
相当于定义为<{1}} 。
来自C99§6.5.2.1/ 2:
后缀表达式后跟方括号
*(data + i)
中的表达式是下标 指定数组对象的元素。下标运算符[]
的定义 是[]
与E1[E2]
相同。由于转换规则 应用于二进制(*((E1)+(E2)))
运算符,如果+
是一个数组对象(等效地,指向 数组对象的初始元素)和E1
是一个整数,E2
表示E1[E2]
- thE2
的元素(从零开始计算)。
请注意,由于二进制E1
运算符是可交换的,这意味着+
等同于a[b]
,即使b[a]
是整数且b
是指针或数组,因此像a
这样的表达式是合法且定义明确的。
那就是说,写4["a character array"]
通常被认为是坏风格(*(data + i)
几乎总是被认为是坏风格,除非你试图赢得国际混淆C代码竞赛)。除非你有充分的理由,否则只需写下4["a character array"]
并完成它。
答案 1 :(得分:3)
是的,
是真的*(data+i)
访问与
相同的数据data[i]
但通常不太可读。它只是指针算术。 .member
部分并不重要,重要的是指针取消引用和数组索引表示法等效。
答案 2 :(得分:0)
(data + i)和data [i]给出相同的值。((data + i))。member和data [i] .member也可以给出相同的值。
答案 3 :(得分:0)
正如其他人所说,2是等同的
但值得注意的是,data[i]
的误解风险很小,我们自动将其视为数组的第i个元素。
但是,根据具体情况,通常很容易忘记pointer+i
是pointer+(i*sizeof(whatptrpointsto))
而不是pointer+(i bytes)
。