将结构传递给函数
我是一个新的C程序员,我想知道如何将一个struct
传递给一个函数。 我得到一个错误,不能找出正确的语法来做到这一点。 这是它的代码….
struct
:
struct student{ char firstname[30]; char surname[30]; }; struct student person;
呼叫:
addStudent(person);
原型:
void addStudent(struct student);
和实际的function:
void addStudent(person) { return; }
编译器错误:
line 21: warning: dubious tag declaration: struct student line 223: argument #1 is incompatible with prototype:
行function的实现应该是:
void addStudent(struct student person) { }
person
不是一个types而是一个variables,你不能用它作为一个函数参数的types。
此外,确保你的结构是在函数addStudent
的原型之前定义的,原型使用它。
这是如何通过引用传递struct
。 这意味着你的函数可以访问struct
之外的struct
并修改它的值。 你可以通过传递一个指向结构的指针来实现这个function。
#include <stdio.h> /* card structure definition */ struct card { int face; // define pointer face }; // end structure card typedef struct card Card ; /* prototype */ void passByReference(Card *c) ; int main(void) { Card c ; c.face = 1 ; Card *cptr = &c ; // pointer to Card c printf("The value of c before function passing = %d\n", c.face); printf("The value of cptr before function = %d\n",cptr->face); passByReference(cptr); printf("The value of c after function passing = %d\n", c.face); return 0 ; // successfully ran program } void passByReference(Card *c) { c->face = 4; }
这是如何通过值传递struct
,以便您的函数接收struct
的副本,不能访问外部结构来修改它。 外部我的意思是在function之外。
#include <stdio.h> /* global card structure definition */ struct card { int face ; // define pointer face };// end structure card typedef struct card Card ; /* function prototypes */ void passByValue(Card c); int main(void) { Card c ; c.face = 1; printf("c.face before passByValue() = %d\n", c.face); passByValue(c); printf("c.face after passByValue() = %d\n",c.face); printf("As you can see the value of c did not change\n"); printf("\nand the Card c inside the function has been destroyed" "\n(no longer in memory)"); } void passByValue(Card c) { c.face = 5; }
当把一个结构体传递给另一个函数时,通常最好像Donnell所build议的那样去做,然后通过引用来传递它。
这样做的一个很好的理由是,如果您想要进行更改,那么当您返回到创build实例的函数时将会反映出来。
以下是执行此操作的最简单方法的示例:
#include <stdio.h> typedef struct student { int age; } student; void addStudent(student *s) { /* Here we can use the arrow operator (->) to dereference the pointer and access any of it's members: */ s->age = 10; } int main(void) { student aStudent = {0}; /* create an instance of the student struct */ addStudent(&aStudent); /* pass a pointer to the instance */ printf("%d", aStudent.age); return 0; }
在这个例子中, addStudent()
函数的参数是一个指向student
struct – student *s
的实例的指针。 在main()
,我们创build了一个student
结构体的实例,然后使用引用运算符( &
)将引用传递给我们的addStudent()
函数。
在addStudent()
函数中,我们可以使用箭头运算符( ->
)来取消引用指针,并访问它的任何成员(function相当于: (*s).age
)。
当我们返回到main()
时,我们在addStudent()
函数中所做的任何更改都会反映出来,因为指针给了我们一个引用,指向内存中存储student
结构实例的地方。 这由printf()
来说明,在这个例子中它将输出“10”。
如果你没有通过一个引用,你实际上正在处理你传递给函数的struct的一个副本,这意味着当你返回到main
时,任何变化都不会被反映出来 – 除非你实现了一种传递新版本的方法结构回到主或沿着这些线的东西!
尽pipe指针可能起初看起来让人厌烦,但是一旦你了解了它们的工作方式以及为什么它们如此方便,它们就变成了第二天性,而你却想知道如果没有它们,你是如何应付的!
你需要指定一个人的types:
void addStudent(struct student person) { ... }
另外,您可以键入结构以避免在每次使用时inputstruct:
typedef struct student{ ... } student_t; void addStudent(student_t person) { ... }
代替:
void addStudent(person) { return; }
尝试这个:
void addStudent(student person) { return; }
由于您已经声明了一个名为“student”的结构,因此您不必在函数实现中指定如下所示的结构:
void addStudent(struct student person) { return; }