【问题标题】:Array of structures and pointer arithmetic结构数组和指针算法
【发布时间】:2014-02-04 04:51:12
【问题描述】:

如何使用指针算法访问结构数组?

假设我有一个结构

struct point{
int x;
int y;
}collection[100];

假设我有一个函数

int func(struct point *collection,int size)   

在这个函数中,我访问了如下所示的元素。

collection[0].x 

这和*(collection + 0).x一样吗?既然.操作符比*操作符优先级高,那么先把集合指针加0,再应用点操作符,然后指针解引用?不知何故,这没有意义;任何澄清表示赞赏。

【问题讨论】:

  • 如果你真的想烤你的面条,你能弄清楚0[collection].x是什么吗?
  • @Eric Lippert (*(0 + collection)).x,根据我收集的 [] 运算符的意思...a[5] = *(a+5) 所以 5[a]表示 *(5+a) 因此 0[collection].x 与 collection[0].x 相同,我花了一些时间,我做对了吗。
  • 你明白了!索引只是一种花哨的加法,加法是可交换的。

标签: c arrays pointers structure


【解决方案1】:

这和*(collection + 0).x一样吗?

没有。你的解释是绝对正确的,. 的优先级高于*,所以第二个表达式被解析为*((collection + 0).x)。另一方面,collection[i].x 等价于 (*(collection + i)).x

其实这种尴尬是引入->操作符的原因,所以假设y是一个不平凡的表达式,你可以写

y->x

而不是

(*(y)).x

虽然在这个特定的例子中,collection[0].x 显然比 (collection + 0)->x 干净得多。

【讨论】:

  • (*(collection + i)).x,这现在更有意义了,因此在使用指针运算时,结构数组在点运算符之前有一组额外的括号。
  • @tesseract: 好吧,我想本质是,如果你有一个指向结构的指针(例如collection + i,它是一个指针),并且你想访问指向的结构的一个字段要通过您的指针,您需要 dereference 指针,然后将点运算符应用于它。由于点运算符具有相当高的优先级,因此您需要使用一对显式括号强制取消引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
相关资源
最近更新 更多