2015-02-11 101 views
0

我有一个函数接收作为参数的结构数组的小问题,当试图访问数组元素与运算符 - >我不能访问的结构数组元素 - >

#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); 
    } 
} 

,如果你试图编译

*error #2140: Type error in argument 1 to 'ingreso'; expected 'registro * *' but found 'registro *'.* 

,因为它抛出这个错误,以及如何解决它抛出这个错误?

+0

问题不在于此代码中,你如何调用'entry()'? – 2015-02-11 19:05:39

+0

我们需要看到'void entry(...)的调用。)'有任何帮助,但问题驻留在那里,因为编译器抱怨你正在传递'registro *'而不是'registro **',可能你有'registers [0]'而不是' &registers [0]'或者你传递一个'registro [NUM]'而不是'registro * [NUM]'。 – Jack 2015-02-11 19:06:07

+0

我编辑了添加完整程序的问题 – Kevin 2015-02-11 19:14:04

回答

2

一个struct内访问数据时,您需要了解->.运营商之间的差异。

  • s.a仅仅是当s是一个structas
  • sp->a成员实际上只是(*sp).a这是一个速记时使用sp是一个指针-TO-struct,我们要取消引用并一步访问struct的数据。

正如VolAnd说,你正在使用reg[i]->order但你确实应该使用reg[i].order


如果目前还不清楚......

有了您entry()功能,你传递10条structs称为reg的数组。你可以通过传递一个指向数组基地址的指针来实现,所以函数接受一个类型为record*的指针。

数组的元素是structsstruct指针,所以你reg[i].order,不reg[i]->order访问它们。

+0

感谢您的详细解释。 – VolAnd 2015-02-11 19:47:16

5

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

reg[i].order = i; 

和printf参数一样。

+1

,因为它不会与运算符编译 - > – Kevin 2015-02-11 19:35:49

3

我想你这样的代码和整个印刷完全正确的数组:

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

我的优先级是与运算符I一起工作 - > – Kevin 2015-02-11 19:38:30

+0

删除像这样的reg索引:reg - > order = i;我编辑了我的答案 – MHSFisher 2015-02-11 19:42:32

+1

我不认为这是正确的。最终我们想要访问'reg [i] .order',因为'reg'是一个指向数组底部的指针,它也可以写成'(*(reg + i))。访问'reg-> order'实际上访问'(* reg).order',它只是数组中的第一个'struct'。如果你运行这段代码,你会发现你只能正确初始化第一个'struct'的内容,而其余的则包含垃圾。 – eigenchris 2015-02-11 19:57:41

0

在这里你传递数组的地址和存储/收集是在指针。 而且当指针指向数组时,如果使用 - >运算符访问结构元素,它会将数组视为指针并将错误视为“错误:无效类型参数” - “有ârecordâ”。所以你必须使用(。)运算符( - >)运算符的运算符(十六进制)。

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