将struct传递给函数

时间:2012-04-29 05:52:21

标签: c function struct

我是一名新的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与原型不兼容:

5 个答案:

答案 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;
}