在C中,如何访问指针数组中的结构中的变量?

时间:2010-10-07 19:44:36

标签: c pointers

typedef struct {
    employeeT *employees;
    int nEmployees;
} *payrollT;

typedef struct {
    string name;
} *employeeT;

我需要在不将其作为数组访问的情况下执行此操作:

employeeT e = payroll.employees[i];

但是这给了我一个错误('('标记)之前的预期标识符:

employeeT e = payroll.(*(employee+i));

在结构之前,我可以交换员工[i]和*(员工+我)

5 个答案:

答案 0 :(得分:3)

为什么需要避免数组语法?

*(ptr+offset) == ptr[offset],严格地说,每次都是。

您没有性能损失,阵列语法更清晰。


编辑:我刚刚得到了问题的真正症结。

如果payroll(在您的示例中)是指针类型,则需要使用箭头运算符而不是点运算符:

payroll->employees[0]

答案 1 :(得分:1)

正如其他人所说,

employeeT e = *(payroll.employees + i);

(或*(payroll->employees + i)如果payroll是指针而不是结构本身,那就可以了。

但是让我们回到你的问题; 为什么您认为无法使用数组语法访问payroll.employees? C标准非常清楚,两个表达式是等价的 - 这实际上是数组下标运算符[ ]的定义(§6.5.2.1数组订阅):

  

下标的定义   operator []是E1 [E2]   与(*((E1)+(E2)))相同。因为   适用的转换规则   如果E1是一个二进制+运算符   数组对象(等效地,指针   到数组的初始元素   对象)和E2是整数,E1 [E2]   表示E1的第E2个元素   (从零开始计算)。

答案 2 :(得分:0)

嗯,你可以这样做:

employeeT e = *(payroll.employees+i);

但是数组语法有什么问题?这当然更清楚。

答案 3 :(得分:0)

employeeT e = *(payroll.employee+i);

应该做的。

答案 4 :(得分:0)

您必须重新使用struct s。试试*(payroll.employee+i)

修改:或者您可以使用(*payroll).employee[i]