Передача структуры в функцию

Я новый программист на 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 ответов

Решение

Реализация функции строки должна быть:

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 - если вы не реализовали способ передачи новой версии структуры обратно в main или что-то в этом роде!

Хотя указатели на первый взгляд могут показаться неуместными, как только вы осознаете, как они работают и почему они так удобны, они становятся второй натурой, и вы удивляетесь, как вы справились без них!

Вам необходимо указать тип на человека:

void addStudent(struct student person) {
...
}

Кроме того, вы можете напечатать свою структуру, чтобы избежать необходимости вводить структуру каждый раз, когда вы ее используете:

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;
}
Другие вопросы по тегам