在C语言中,如何访问';在指针数组中是什么?

在C语言中,如何访问';在指针数组中是什么?,c,pointers,C,Pointers,我需要在不作为阵列访问的情况下执行此操作: typedef struct { employeeT *employees; int nEmployees; } *payrollT; typedef struct { string name; } *employeeT; 但这给了我一个错误(在“(”标记之前应该有标识符): 在struct's之前,我可以交换雇员[I]和*(雇员+I)那么,您可以: employeeT e = payroll.(*(employee+i))

我需要在不作为阵列访问的情况下执行此操作:

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

typedef struct {
    string name;
} *employeeT;
但这给了我一个错误(在“(”标记之前应该有标识符):

在struct's之前,我可以交换雇员[I]和*(雇员+I)

那么,您可以:

employeeT e = payroll.(*(employee+i));
但是数组语法有什么问题吗?当然更清楚了

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

应该这样做。

为什么需要避免数组语法

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

没有性能损失,数组语法更清晰


编辑:我才知道问题的真正症结所在

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

employeeT e = *(payroll.employee+i);
正如其他人指出的那样

payroll->employees[0]
(或者
*(payroll->employees+i)
如果
payroll
是指针而不是结构本身)工作正常

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

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


您必须重述一下
struct
s的用法。请尝试
*(payroll.employee+i)


编辑:或者您可以使用
(*工资单)。员工[i]

您真的没有为指向该结构的非指针定义类型吗?如果这是作业,请添加“作业”标记。+1用于查找
->
错误。也许您可以将答案的两段颠倒过来,因为真正的答案是第二部分;-)@Jens Gustedt:嘿。我被typedef扔进了指针类型…这是我从来没有使用过的东西,我认为这是一个可怕的黑客行为,应该从标准中被取缔。:-(@Platinum Azure:是的,事实上,我更喜欢指针的箭头符号,但我想使用对提问者来说似乎更熟悉的符号。
payroll->employees[0]
employeeT e = *(payroll.employees + i);