我是一名新的C程序员,我想知道如何将struct
传递给函数。我收到错误,无法找出正确的语法来执行此操作。这是它的代码....
STRUCT:
struct student{
char firstname[30];
char surname[30];
};
struct student person;
呼叫:
addStudent(person);
原型:
void addStudent(struct student);
和实际功能:
void addStudent(person)
{
return;
}
编译器错误:
第21行:警告:可疑标签声明:struct student
第223行:参数#1与原型不兼容:
答案 0 :(得分:89)
这是通过引用传递struct
的方法。这意味着您的函数可以访问函数外部的struct
并修改其值。您可以通过将指向结构的指针传递给函数来完成此操作。
#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
的副本,并且无法访问外部结构来修改它。外观我的意思是在功能之外。
#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;
}
答案 1 :(得分:39)
行功能实现应该是:
void addStudent(struct student person) {
}
person
不是类型而是变量,不能将其用作函数参数的类型。
此外,确保在原型使用函数原型addStudent
之前定义结构。
答案 2 :(得分:8)
将结构传递给另一个函数时,通常最好像Donnell上面建议的那样,并通过引用传递它。
这样做的一个很好的理由是,如果您想要在返回创建其实例的函数时反映出更改,则会使事情变得更容易。
以下是执行此操作的最简单方法的示例:
#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
结构的实例的指针 - student *s
。在main()
中,我们创建student
结构的实例,然后使用引用运算符(addStudent()
)将引用传递给我们的&
函数。
在addStudent()
函数中,我们可以使用箭头运算符(->
)来取消引用指针,并访问它的任何成员(功能相当于:(*s).age
})。
当我们返回addStudent()
时,我们在main()
函数中所做的任何更改都会反映出来,因为指针为我们提供了对student
实例在内存中的位置的引用结构正在存储。这由printf()
说明,它将输出&#34; 10&#34;在这个例子中。
如果您没有传递引用,那么您实际上将使用传递给函数的结构的副本,这意味着当您返回main
时不会反映任何更改 - 除非您实现了将结构的新版本传递回main或者沿着这些行传递的方法!
虽然指针起初可能看起来有点令人反感,但是一旦你了解它们的工作方式以及为什么它们如此方便,它们就会成为第二天性,你会想知道如果没有它们你是如何应对的!
答案 3 :(得分:4)
您需要在人身上指定类型:
void addStudent(struct student person) {
...
}
此外,您可以键入您的结构,以避免每次使用时都必须输入struct:
typedef struct student{
...
} student_t;
void addStudent(student_t person) {
...
}
答案 4 :(得分:0)
而不是:
void addStudent(person)
{
return;
}
试试这个:
void addStudent(student person)
{
return;
}
由于您已经声明了一个名为“student”的结构,因此您不必在函数实现中指定,例如:
void addStudent(struct student person)
{
return;
}