meneruskan struct ke suatu fungsi tidak berhasil [duplikat]
Pada kode di bawah ini saya telah membuat fungsi selain main untuk membagi int di dalam struct menjadi dua.
Setelah itu, saya ingin mencetak nilai baru. Namun nilai print outnya tetap yang lama.
Saya percaya pengetahuan fundamental saya tentang struct dan pointer tidak cukup baik.
Adakah yang bisa membantu saya dengan ini? Terima kasih banyak!!!
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);
}
Jawaban
Fungsinya divide
adalah memodifikasi salinan struktur itu karena struktur adalah nilai yang lewat. Anda harus meneruskan penunjuk ke struktur, sehingga fungsi tersebut dapat mengubah aslinya.
void divide(person* A)
{
person half;
half.age = A->age / 2;
half.wage = A->wage / 2;
*A = half;
}
Disebut divide
dengan alamat struktur asli
divide(&A);
Saat Anda meneruskan A
ke divide
, salinan dari A
dibuat. Memodifikasi salinan di dalam divide
ini tidak berpengaruh pada variabel lokal yang A
Anda tentukan main
. Untuk memperbaiki hal ini, Anda dapat membuat divide
mengambil pointer ke person
. Sebuah pointer secara efektif merepresentasikan sebuah alamat dalam memori sehingga Anda dapat menggunakannya untuk misalnya mengakses variabel lokal yang didefinisikan dalam fungsi lain yang tidak dapat diakses (riset stack frame jika Anda ingin memahami mengapa hal ini terjadi).
Jadi dalam praktek Anda mengubah divide
tanda tangan 's ke: void divide(person *A)
dan di baris terakhir fungsi ini Anda assing tidak A
tapi apa pun A
menunjuk ke dengan menggunakan operator dereference: *A = half
. Dalam Anda main
fungsi yang kemudian lulus alamat dari A
bukan A
dirinya untuk divide
menggunakan alamat operator: divide(&A)
.
EDIT: bahkan lebih baik, Anda dapat menghindari membuat sementara half
dengan langsung melakukan: A->age /= 2
dan di A->wage /= 2
mana A.x
gula sintaksis untuk (*A).x
.