处理C结构数组时,是(*(data + i))。成员与data [i] .member相同?

时间:2013-11-19 23:15:08

标签: c arrays pointers struct

我是处理结构的新手,特别是结构数组。

我想知道这是否正确。

(*(data+i)).member == data[i].member  ?      

4 个答案:

答案 0 :(得分:5)

是的,两者保证是等价的。特别是,C语言标准根据指针算法定义了数组下标data[i] - data[i]相当于定义为<{1}}

来自C99§6.5.2.1/ 2:

  

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

请注意,由于二进制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+ipointer+(i*sizeof(whatptrpointsto))而不是pointer+(i bytes)