przekazanie struktury do funkcji nie działa [duplikat]
W poniższym kodzie utworzyłem funkcję oprócz main, aby podzielić int wewnątrz struktury na pół.
Następnie chcę wydrukować nową wartość. Jednak wartość wydruku jest nadal stara.
Uważam, że moja podstawowa znajomość struktury i wskaźników nie jest wystarczająco dobra.
Czy ktoś może mi w tym pomóc? Wielkie dzięki!!!
typedef struct{
int age;
int wage;
}person;
void divide(person A)
{
person half;
half.age = A.age / 2;
half.wage = A.wage / 2;
A = half;
}
int main(void)
{
person A;
A.age = 30;
A.wage = 35000;
divide(A);
printf("%i\n", A.age);
}
Odpowiedzi
Funkcja divide
modyfikuje kopię tej struktury, ponieważ struktury są przekazywane przez wartość. Będziesz musiał przekazać wskaźnik do struktury, aby funkcja mogła zmodyfikować oryginał.
void divide(person* A)
{
person half;
half.age = A->age / 2;
half.wage = A->wage / 2;
*A = half;
}
O nazwie divide
z adresem oryginalnej struktury
divide(&A);
Kiedy przejdziesz A
do divide
, A
zostanie utworzona kopia . Modyfikacja tej kopii wewnątrz divide
nie ma wpływu na zmienną lokalną A
zdefiniowaną w main
. Aby temu zaradzić, możesz divide
wziąć wskaźnik do person
. Wskaźnik skutecznie reprezentuje adres w pamięci tak, że można go użyć do np. Uzyskania dostępu do zmiennych lokalnych zdefiniowanych w innych funkcjach, które w innym przypadku nie byłyby dostępne (badanie ramek stosu, jeśli chcesz zrozumieć, dlaczego tak jest).
Tak więc w praktyce zmienić divide
„s podpis: void divide(person *A)
aw ostatnim wierszu tej funkcji nie assing się A
jednak do tego, co A
wskazuje za pomocą operatora wyłuskiwania: *A = half
. W swojej main
funkcji, którą następnie przekazać adres z A
zamiast A
się do divide
korzystania adres wykonawcy: divide(&A)
.
EDYCJA: jeszcze lepiej, możesz uniknąć tworzenia tymczasowego half
, wykonując bezpośrednio: A->age /= 2
i A->wage /= 2
gdzie A.x
jest cukier syntaktyczny (*A).x
.