C语言 在指针上使用成员访问运算符



我已经有一段时间没有使用C了,现在我正在尝试回到它。

我的

问题是我的代码确实有效,尽管我确信我会收到语法错误。他是我想要的:多边形的动态数组,每个多边形都有一个动态的点数组。

struct point{
  int x,y;
};
struct polygon{
  int quantity;
  struct point* point_list;
};

然后,我将初始化一个多边形数组:

struct polygon* poly_array = (struct polygon*) malloc(sizeof(struct polygon)*num);

并且,初始化每个多边形的点数组:

poly_array[i].quantity = points;
poly_array[i].point_list = (struct point*) malloc (sizeof( struct point) *  poly_array[i].quantity);

现在,我认为我正在做的是创建指向对象的指针数组。因此,要访问内部字段,我需要使用"->"运算符。但是不,它适用于对字段的"直接"访问(短版本,没有循环代码):

poly_array[i].point_list[j].x = i;
poly_array[i].point_list[j].y = j;

并打印:

printf ("poly %d: (%d, %d)n", j, poly_array[i].point_list[j].x, poly_array[i].point_list[j].y);

因此,为了明确我的问题,我将再次问:由于我正在迭代指向对象的指针,我不应该使用 -> 运算符吗?

在您的代码中,poly_array 属于 struct polygon* 类型,因此,poly_array[i] 将是 struct polygon 类型。因此,您必须使用 . 运算符。

同样的逻辑也适用于point_list[j]

为了详细说明,引用C11,第 §6.5.2.1 章,数组下标强调我的

语法

postfix-expression [ expression ]

约束

其中一个表达式的类型应为

"指向完整对象类型的指针",另一个表达式的类型应为 表达式应具有整数类型,结果应具有类型"类型"。

也就是说,请参阅此讨论,了解为什么不在C中转换malloc()和家庭的返回值。

简短的回答是按索引引用数组已经取消引用索引项,因此使用点语法是正确的。

poly_array[i].point_list[j].x

您也可以使用"->"运算符直接取消引用项目,而无需使用索引运算符 []。在这种情况下,您将使用指针算法。

(((poly_array+i)->point_list)+j)->x

相关内容

  • 没有找到相关文章

最新更新