我是一个新的C程序员,我想知道我怎么能传递一个struct
通过一个函数。 我发现了一个错误,无法找出正确的语法来做到这一点。 下面是它的代码....
结构:
struct student{
char firstname[30];
char surname[30];
};
struct student person;
呼叫:
addStudent(person);
原型:
void addStudent(struct student);
和实际的功能:
void addStudent(person)
{
return;
}
编译器错误:
第21行:警告:可疑标记声明:结构学生
行223:参数#1是不兼容的原型:
该行执行的功能应该是:
void addStudent(struct student person) {
}
person
是不是一个类型,但一个变量,你不能用它作为函数参数的类型。
此外,请确保您的结构是函数的原型之前定义addStudent
为原型使用它。
这是如何通过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;
}
当通过一个结构到另一功能,它通常会更好地做如奥唐纳上面所建议的,并通过引用将它传递代替。
一个很好的原因是,它使假如你想当您返回到创建它的实例的功能将体现改变的东西更容易。
下面是做到这一点的最简单的方法的例子:
#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()
其将输出“10”在这个例子中。
如果你不是通过一个参考,你实际上可以用你传递给函数的结构的拷贝工作,这意味着当您返回任何更改将不会反映main
-除非你实现通过新版本的方式该结构回主或东西沿着这些线路!
虽然指针看起来倒胃口首先,一旦你得到你的头围绕它们是如何工作以及为什么它们是那么得心应手,他们成为第二天性,你想知道你曾经没有他们应对!
你需要指定一个人类型:
void addStudent(struct student person) {
...
}
此外,您还可以的typedef你的结构,以避免在每次使用它的时间结构类型:
typedef struct student{
...
} student_t;
void addStudent(student_t person) {
...
}
代替:
void addStudent(person)
{
return;
}
试试这个:
void addStudent(student person)
{
return;
}
既然你已经宣布了一个名为“学生”的结构,你不必在功能实现在指定这样:
void addStudent(struct student person)
{
return;
}