typedef struct {
employeeT *employees;
int nEmployees;
} *payrollT;
typedef struct {
string name;
} *employeeT;
我需要在不将其作为数组访问的情况下执行此操作:
employeeT e = payroll.employees[i];
但是这给了我一个错误('('标记)之前的预期标识符:
employeeT e = payroll.(*(employee+i));
在结构之前,我可以交换员工[i]和*(员工+我)
答案 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]
。