Передача структуры в функцию
Я новый программист на C, и мне хотелось знать, как передать функцию struct
на функцию. Я получаю сообщение об ошибке и не могу определить правильный синтаксис. Вот код для него....
struct
:
struct student{
char firstname[30];
char surname[30];
};
struct student person;
вызов:
addStudent(person);
прототип:
void addStudent(struct student);
и фактическая функция:
void addStudent(person)
{
return;
}
ошибки компилятора:
line 21: warning: dubious tag declaration: struct student
line 223: argument #1 is incompatible with prototype:
Ответы
Ответ 1
Реализация функции линии должна быть:
void addStudent(struct student person) {
}
person
- это не тип, а переменная, вы не можете использовать его как тип параметра функции.
Кроме того, убедитесь, что ваша структура определена перед прототипом функции addStudent
, поскольку прототип ее использует.
Ответ 2
Вот как передать 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;
}
Ответ 3
При передаче структуры в другую функцию обычно лучше делать, как предложил Доннелл выше, и передать ее по ссылке.
Очень хорошая причина для этого состоит в том, что упростить работу, если вы хотите внести изменения, которые будут отображаться, когда вы вернетесь к функции, которая создала его экземпляр.
Вот пример простейшего способа сделать это:
#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 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()
мы создаем экземпляр структуры student
, а затем передаем ссылку на него нашей функции addStudent()
, используя ссылочный оператор (&
).
В функции addStudent()
мы можем использовать оператор стрелки (->
) для разыменования указателя и доступа к любому из его членов (функционально эквивалентный: (*s).age
).
Любые изменения, которые мы делаем в функции addStudent()
, будут отражаться, когда мы вернемся к main()
, потому что указатель дал нам ссылку на то, где в памяти хранится экземпляр структуры student
. Это иллюстрируется printf()
, который будет выводить "10" в этом примере.
Если бы вы не передали ссылку, вы бы действительно работали с копией структуры, которую вы передали функции, что означает, что любые изменения не будут отражаться при возврате к main
- если вы не внедрили способ передавая новую версию структуры обратно на главную или что-то в этом направлении!
Несмотря на то, что указатели могут казаться неактивными сначала, как только вы обдумываете, как они работают, и почему они так удобны, они становятся второй натурой, и вам интересно, как вы справлялись без них!
Ответ 4
Вам нужно указать тип для человека:
void addStudent(struct student person) {
...
}
Кроме того, вы можете напечатать вашу структуру, чтобы избежать необходимости вводить структуру каждый раз, когда вы ее используете:
typedef struct student{
...
} student_t;
void addStudent(student_t person) {
...
}
Ответ 5
Вместо:
void addStudent(person)
{
return;
}
попробуйте следующее:
void addStudent(student person)
{
return;
}
Поскольку вы уже объявили структуру под названием "студент", вам необязательно указывать ее в реализации функции, как в:
void addStudent(struct student person)
{
return;
}