Podczas przekazywania struct do innej funkcji, zwykle lepiej jest zrobić tak, jak sugerował Donnell powyżej i przekazać ją przez odniesienie.
Bardzo dobrym tego powodem jest to, że ułatwia to, jeśli chcesz wprowadzić zmiany, które zostaną odzwierciedlone po powrocie do funkcji, która stworzyła jego wystąpienie.
Oto przykład najprostszy sposób to zrobić:
#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;
}
W tym przykładzie argument dla funkcji addStudent()
jest wskaźnikiem do instancji student
struct - student *s
.W main()
tworzymy instancję struktury student
, a następnie przekazujemy odwołanie do niej naszej funkcji addStudent()
przy użyciu operatora referencyjnego (&
).
W funkcji addStudent()
możemy użyć operatora strzałki (->
), aby usunąć zaznaczenie wskaźnika i uzyskać dostęp do jego elementów (funkcjonalnie równoważne: (*s).age
).
Wszelkie zmiany, które podejmujemy w funkcji addStudent()
zostaną uwzględnione, gdy wrócimy do main()
, ponieważ wskaźnik dał nam odniesienie do miejsca, gdzie w pamięci wystąpienie student
struct jest przechowywany. Jest to zilustrowane przez printf()
, który wyświetli "10" w tym przykładzie.
Jeśli nie przekazałeś referencji, faktycznie pracowałbyś z kopią struktury przekazanej do funkcji, co oznacza, że wszelkie zmiany nie zostaną odzwierciedlone po powrocie do main
- chyba że zaimplementowałeś sposób przekazywania nowa wersja struktury do głównej lub coś podobnego!
Chociaż wskaźniki na pierwszy rzut oka mogą wydawać się odstręczające, gdy tylko zorientujesz się, jak działają i dlaczego są tak poręczne, stają się drugą naturą i zastanawiasz się, jak poradziłeś sobie bez nich!
Gdzie deklarujesz swoją strukturę? W twoim aktualnym pliku implementacyjnym, gdzie jest twój kod 'struct student {/ * ... * /};? Wygląda na to, że jest w niewłaściwym zakresie (jak zadeklarowano w twojej funkcji "głównej" lub jakiejkolwiek funkcji, którą próbujesz nazwać 'addStudent' od ... –
tak w moim zakresie funkcji –