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 dividemodyfikuje 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 dividez adresem oryginalnej struktury
divide(&A);
Kiedy przejdziesz Ado divide, Azostanie utworzona kopia . Modyfikacja tej kopii wewnątrz dividenie ma wpływu na zmienną lokalną Azdefiniowaną w main. Aby temu zaradzić, możesz dividewziąć 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ę Ajednak do tego, co Awskazuje za pomocą operatora wyłuskiwania: *A = half. W swojej mainfunkcji, którą następnie przekazać adres z Azamiast Asię do dividekorzystania adres wykonawcy: divide(&A).
EDYCJA: jeszcze lepiej, możesz uniknąć tworzenia tymczasowego half, wykonując bezpośrednio: A->age /= 2i A->wage /= 2gdzie A.xjest cukier syntaktyczny (*A).x.