C 我无法使用->

C 我无法使用->,c,struct,C,Struct,我对一个函数有一个小问题,它接收一个结构数组作为参数,这个问题发生在尝试使用操作符->访问数组元素时 #include <stdio.h> typedef struct{ int order; }record; void entry(record*reg, size_t num_regs); int main(void){ record reg[10]; entry(reg, sizeof reg / sizeof reg[0]); retur

我对一个函数有一个小问题,它接收一个结构数组作为参数,这个问题发生在尝试使用操作符->访问数组元素时

#include <stdio.h>

typedef struct{
    int order;
}record;

void entry(record*reg, size_t num_regs);

int main(void){
    record reg[10];
    entry(reg, sizeof reg / sizeof reg[0]);

    return 0;
}

void entry(record*reg, size_t num_regs){
    size_t i;

    for (i = 0; i < num_regs; i++){
        reg[i]->order = i;
        printf("\n order = %d", reg[i]->order);
    }
}

因为它抛出了这个错误以及如何修复它?

当您使用[]作为指针时,您已经有了一个数据,所以请使用。而不是->

reg[i].order = i;

printf参数也是如此。

当指针使用[]时,您已经有了数据,所以请使用。而不是->

reg[i].order = i;

printf参数也是如此。

我像这样尝试了你的代码,整个数组的打印结果完全正确:

for (i = 0; i < num_regs; i++){
    reg->order = i;
    printf("\n order = %d", reg->order);
}

我像这样尝试了你的代码,整个数组打印的都是正确的:

for (i = 0; i < num_regs; i++){
    reg->order = i;
    printf("\n order = %d", reg->order);
}

您需要理解->和之间的区别。访问结构内部数据时的运算符

s、 a仅用于s是结构体且a是s的成员时 sp->a实际上只是*sp.a的简写。当sp是指向struct的指针时,我们要在一个步骤中解除对该指针的引用并访问该结构的数据。 正如VolAnd所说,您使用的是reg[i]->order,但实际上应该使用reg[i].order

如果还不清楚的话

使用entry函数,您将传入一个名为reg的10个记录结构数组。您可以通过传递一个指向数组基址的指针来实现这一点,因此函数接受record*类型的指针


数组的元素是结构,而不是结构指针,因此您可以使用reg[i].order,而不是reg[i]->order来访问它们。

您需要理解->和之间的区别。访问结构内部数据时的运算符

s、 a仅用于s是结构体且a是s的成员时 sp->a实际上只是*sp.a的简写。当sp是指向struct的指针时,我们要在一个步骤中解除对该指针的引用并访问该结构的数据。 正如VolAnd所说,您使用的是reg[i]->order,但实际上应该使用reg[i].order

如果还不清楚的话

使用entry函数,您将传入一个名为reg的10个记录结构数组。您可以通过传递一个指向数组基址的指针来实现这一点,因此函数接受record*类型的指针


数组的元素是结构,而不是结构指针,因此可以使用reg[i].order,而不是reg[i]->order来访问它们。

这里传递数组的地址,存储/收集在指针中。 由于指针指向数组,如果使用->运算符访问结构元素,它将把数组视为指针,并将错误作为错误抛出:无效类型参数为-->have-record

所以你必须使用。操作员安装->操作员

for (i = 0; i < num_regs; i++)
{
    reg[i].order = i;
    printf("\n order = %d", reg[i].order);
}

在这里,您传递的是数组的地址,存储/收集的是指针。 由于指针指向数组,如果使用->运算符访问结构元素,它将把数组视为指针,并将错误作为错误抛出:无效类型参数为-->have-record

所以你必须使用。操作员安装->操作员

for (i = 0; i < num_regs; i++)
{
    reg[i].order = i;
    printf("\n order = %d", reg[i].order);
}

问题不在这段代码中,您如何调用entry?我们需要看到void entry的调用。。有任何帮助,但问题就在这里,因为编译器抱怨您传递的是registro*而不是registro**,可能您传递的是寄存器[0],而不是®isters[0],或者您传递的是registro[NUM],而不是registro*[NUM]。我再次编辑了添加完整程序的问题,问题不在这段代码中。一旦根据下面Voland的回答修复了访问器语法,此代码将按预期编译和运行。发布显示真实问题的真实代码。它不会使用->编译,因为->的使用是不正确的。你为什么坚持使用它?VolAnd和Fisher都为您提供了正确的代码版本。问题不在这段代码中,您如何调用entry?我们需要查看void entry的调用。。有任何帮助,但问题就在这里,因为编译器抱怨您传递的是registro*而不是registro**,可能您传递的是寄存器[0],而不是®isters[0],或者您传递的是registro[NUM],而不是registro*[NUM]。我再次编辑了添加完整程序的问题,问题不在这段代码中。一旦根据下面Voland的回答修复了访问器语法,此代码将按预期编译和运行。发布显示真实问题的真实代码。它不会使用->编译,因为->的使用是不正确的。你为什么坚持使用它?VolAnd和Fisher都为您提供了正确的代码版本。因为它不使用运算符->因为它不使用运算符->删除reg的索引,如下所示:reg->order=i;我编辑了我的回答,我认为这不正确。最后,我们希望访问reg[i].order,它也可以写为*reg+i.order,因为reg是指向数组基的指针。访问reg->order实际上就是访问*reg.order,它只是数组中的第一个结构。如果你
运行这段代码,你会发现你只正确初始化了第一个结构的内容,而其余的包含垃圾;我编辑了我的回答,我认为这不正确。最后,我们希望访问reg[i].order,它也可以写为*reg+i.order,因为reg是指向数组基的指针。访问reg->order实际上就是访问*reg.order,它只是数组中的第一个结构。如果您运行这段代码,您会发现您只正确初始化了第一个结构的内容,而其余的包含垃圾。感谢您的详细解释。感谢您的详细解释。