如何将typedef结构体传递给函数?

3

At the moment I'm trying

void avg(everything)

但是这给了我一个错误:
error: subscripted value is neither array nor pointer

今天早些时候,当我没有正确地将一个二维数组传递给函数时,就会出现这个错误。所以我觉得这是相同的问题,但我找不到正确的格式来传递。

这是我的typedef:

typedef struct structure
{
char names[13][9];
int scores[13][4];
float average[13];
char letter[13];
} stuff;

这是我的typedef数组:

stuff everything[13];

那么,“everything”是什么? - gukoff
1
void avg(stuff *p); 看起来很合适。 - WhozCraig
1
函数需要定义为 void avg(stuff * s) {} - 但调用需要 avg(everything); - user93353
@WhozCraig 运行得很好,谢谢。也许我应该自己想到那个方法,但是我不确定是否有一些特定的东西我不知道。 - Xerinos
@Xerinos 如果你总是传递一个固定大小的自动数组,那么你可以通过声明形式参数为 void arg(stuff (*ar)[ARRAY_SIZE]); 来跳过长度参数,其中 ARRAY_SIZE 是硬维度。注意:这意味着该函数只能接受该大小的常规数组作为参数。如果要传递其他类型的数组,则需要进行强制转换。 - WhozCraig
2个回答

5

在函数签名中,您需要指定类型,而不是要传递的变量的具体名称。此外,如果要传递数组,您需要传递一个指针(您应该始终通过指针传递结构体,否则每次调用函数时都会创建数据副本)。因此,您的函数应该如下所示:

void avg(stuff* s);

然而,C数组也没有长度的概念。因此,您应该始终将数组的长度传递给函数:

void avg(stuff* s, size_t len);

然后您将按以下方式调用此函数:

avg(everything, 13);

另外,如果该函数不以任何方式修改数据,则应通过指定参数为const来表示:

void avg(const stuff* s, size_t len);

"C数组也有长度的概念"是错误的。你可能指的是一个指向数组第一个元素的指针并不能表示数组的长度。另一方面,对于int arr[42];arr的长度为42。 - Keith Thompson

4

typedef引入的类型是一个可以用于实际类型的别名。

例如:

typedef struct some_struct { ... } some_type_name;

现在你可以使用some_type_name代替struct some_struct

因此,在声明一个函数时,如果其参数是这种“类型”的结构体,则可以像使用任何其他类型一样使用该类型:

void some_function(some_type_name var) { ... }

在上面定义的 some_function 中,您可以像使用普通结构变量一样使用 var
定义一个接受该类型数组(或指针)的函数也同样简单:
void some_function(some_type_name *pointer) { ... }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接