我一直在尝试用C语言写结构体,并尝试和学生们一起写一个简单的结构体,在这个结构体中,我们放入一些数据,以此类推,这是代码,目标是在struct Estudante
中,有一个指向函数calcularMedia
的函数指针,但我想给那个函数传递一个相同结构类型的参数。
#include <string.h>
#include <stdio.h>
typedef struct {
char nome[20];
char turma[10];
int idade;
int notas[10];
int media;
int (*calcularMedia)(Estudante estudante);
} Estudante;
int calcularMedia(Estudante estudante) {
int media = 0;
for (int i = 0; i < sizeof(estudante.notas); i++)
media += estudante.notas[i];
return media;
}
int main() {
Estudante estudante1;
strcpy(estudante1.nome, "Bernardo");
strcpy(estudante1.turma, "10ºF");
estudante1.idade = 15;
for (int i = 0; i < 10; i++)
estudante1.notas[i] = 10;
printf("A media do %s é %d\n", estudante1.nome,
estudante1.calcularMedia(estudante1));
return 0;
}
我试图在结构体内部传递结构体,但结构体有参数
2条答案
按热度按时间jhdbpxl91#
类型别名
Estudante
直到结构本身定义之后才创建,因此不能在结构本身内部使用。但有一个简单的方法可以解决它:使用结构标记名(例如
struct Estudante
)并将其用于参数类型:请注意,结构标记和类型别名使用相同的名称是非常好的,因为结构标记名称位于单独的名称空间中。
如果你真的想用类型别名来代替,那么你需要使用结构的 forward declaration,带一个标记名来定义别名:
另一方面,我建议您向函数传递一个指向结构的 * 指针 *,以避免创建结构的副本。
如果函数不需要修改结构,那么就传递一个指向常量对象的指针:
正如在注解中提到的,在使用函数指针之前,您需要在结构内部为它赋值:
否则,您将使用一个 uninitialized 指针,并且您将具有 undefined behavior。
哦,还有循环
错误。
sizeof
运算符返回的大小以 * 字节 * 为单位,而不是以元素为单位。要获得元素数,请将总大小除以单个元素的大小:z4iuyo4d2#
使用带标记的结构:
如果你想写:
相反(不使用struct关键字),然后使用带标记的struct,您还可以在struct类型完成之前使用typedef: