передача структуры функции не работает [дубликат]
В приведенном ниже коде я создал функцию отдельно от main, чтобы разделить int внутри структуры пополам.
После этого я хочу распечатать новое значение. Однако значение для распечатки остается прежним.
Я считаю, что моих фундаментальных знаний о структурах и указателях недостаточно.
Кто-нибудь может мне с этим помочь? Большое спасибо!!!
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);
}
Ответы
Функция divide
изменяет копию этой структуры, поскольку структуры передаются по значению. Вам нужно будет передать указатель на структуру, чтобы функция могла изменить оригинал.
void divide(person* A)
{
person half;
half.age = A->age / 2;
half.wage = A->wage / 2;
*A = half;
}
Вызывается divide
с адресом исходной структуры
divide(&A);
Когда вы переходите A
к divide
, создается копия A
. Изменение этой копии внутри divide
не влияет на локальную переменную, которую A
вы определили в main
. Чтобы исправить это, вы можете сделать divide
взять указатель на person
. Указатель эффективно представляет адрес в памяти, так что вы можете использовать его, например, для доступа к локальным переменным, определенным в других функциях, которые в противном случае были бы недоступны ( исследуйте кадры стека, если вы хотите понять, почему это так).
Так что на практике изменить divide
подпись «s к: void divide(person *A)
а в последней строке этой функции вы Ассинг не A
только к тому , что A
указывает на с помощью оператора разыменования: *A = half
. В вашей main
функции вы затем передать адрес из A
вместо A
себя для divide
использования адреса оператора: divide(&A)
.
РЕДАКТИРОВАТЬ: даже лучше, вы можете избежать создания временного half
, напрямую выполнив: A->age /= 2
и A->wage /= 2
где A.x
синтаксический сахар для (*A).x
.