我已经有一段时间没有使用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