Mengirim Pointer Struct
Termasuk bagian Logika dan Alur dalam perjalanan C di Coddy. Pelajaran 47 dari 63.
Mengirim struct berdasarkan nilai cocok untuk membaca data, tetapi menjadi tidak efisien jika struct berukuran besar karena seluruh strukturnya disalin. Yang lebih penting, kamu tidak bisa mengubah struct asli dari dalam fungsi. Di sinilah mengirim pointer ke struct menjadi penting.
Saat kamu meneruskan pointer ke struct, bukan struct itu sendiri, fungsi menerima alamat memori dari struct asli. Pendekatan ini menawarkan dua keunggulan utama: lebih efisien karena tidak ada penyalinan, dan memungkinkan fungsi mengubah data asli.
Sintaks untuk fungsi yang menerima pointer ke struct adalah:
void functionName(struct StructureName *ptr) {
// Isi fungsi yang menggunakan ptr->member
}Di dalam fungsi, kamu menggunakan operator panah untuk mengakses dan mengubah anggota struct. Setiap perubahan yang dilakukan melalui pointer akan langsung memengaruhi struct asli di fungsi pemanggil, sehingga pendekatan ini sangat cocok untuk fungsi yang perlu memperbarui atau mengubah data struct.
Teknik ini sangat penting untuk membangun program C yang efisien dan bekerja dengan struktur data yang kompleks, karena teknik ini memadukan kekuatan pointer dengan pengorganisasian struct.
Tantangan
MudahBuat program C yang menunjukkan cara meneruskan pointer ke struct ke fungsi agar data dapat diubah secara efisien. Programmu harus:
- Mendefinisikan
structbernamaBankAccountdengan anggota berikut:- Integer
accountNumberuntuk menyimpan nomor rekening - Array karakter
ownerNameberukuran 30 untuk menyimpan nama pemilik rekening - Float
balanceuntuk menyimpan saldo rekening - Integer
transactionCountuntuk menyimpan jumlah transaksi
- Integer
- Menulis fungsi bernama
depositMoneyyang:- Menerima pointer ke struct
BankAccountdan jumlah float sebagai parameter - Menambahkan jumlah tersebut ke saldo rekening menggunakan operator panah
- Menambah jumlah transaksi sebesar 1
- Mencetak
Deposit successful. New balance: [balance]
- Menerima pointer ke struct
- Menulis fungsi bernama
withdrawMoneyyang:- Menerima pointer ke struct
BankAccountdan jumlah float sebagai parameter - Memeriksa apakah jumlah penarikan lebih besar daripada saldo saat ini
- Jika dana tidak mencukupi, mencetak
Insufficient funds. Current balance: [balance] - Jika dana mencukupi, mengurangi saldo sebesar jumlah tersebut, menambah jumlah transaksi, lalu mencetak
Withdrawal successful. New balance: [balance]
- Menerima pointer ke struct
- Menulis fungsi bernama
displayAccountyang:- Menerima pointer ke struct
BankAccountsebagai parameter - Mencetak informasi rekening dengan format persis seperti berikut:
Account Information:Account Number: [accountNumber]Owner: [ownerName]Balance: [balance]Transactions: [transactionCount]
- Menerima pointer ke struct
- Di fungsi main:
- Membuat variabel
BankAccountbernamaaccount - Membaca nomor rekening, nama pemilik, dan saldo awal dari input
- Mengatur jumlah transaksi menjadi 0
- Memanggil
displayAccountuntuk menampilkan keadaan awal rekening - Membaca jumlah deposit dan memanggil
depositMoney - Membaca jumlah penarikan dan memanggil
withdrawMoney - Memanggil
displayAccountuntuk menampilkan keadaan akhir rekening
- Membuat variabel
Tantangan ini menunjukkan manfaat meneruskan pointer ke struct ke fungsi. Berbeda dengan penerusan berdasarkan nilai, fungsi menerima alamat memori struct asli sehingga dapat mengubah data aslinya secara langsung. Pendekatan ini lebih efisien karena tidak ada penyalinan, dan memungkinkan fungsi mengubah nilai struct secara permanen di fungsi pemanggil.
Coba sendiri
#include <stdio.h>
#include <string.h>
// TODO: Definisikan struct BankAccount di sini
// TODO: Tulis fungsi depositMoney di sini
// TODO: Tulis fungsi withdrawMoney di sini
// TODO: Tulis fungsi displayAccount di sini
int main() {
// Baca input
int accountNum;
char ownerName[30];
float initialBalance;
float depositAmount;
float withdrawAmount;
scanf("%d", &accountNum);
scanf("%s", ownerName);
scanf("%f", &initialBalance);
scanf("%f", &depositAmount);
scanf("%f", &withdrawAmount);
// TODO: Buat variabel BankAccount dan inisialisasi variabel tersebut
// TODO: Panggil displayAccount untuk menampilkan keadaan awal
// TODO: Panggil depositMoney dengan jumlah setoran
// TODO: Panggil withdrawMoney dengan jumlah penarikan
// TODO: Panggil displayAccount untuk menampilkan keadaan akhir
return 0;
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Dasar-Dasar Pointer
Apa Itu Pointer?Mendeklarasikan PointerOperator Address-Of (&)Operator Dereference (*)Pointer NULLRekap: Dasar-Dasar Pointer4Proyek: Utilitas Teks Sederhana
Gambaran Umum ProyekMenghitung Karakter2Pointer dan array
Nama array sebagai pointerElemen array dan pointerAritmetika pointerMembandingkan pointerRangkuman: Menelusuri array dengan pointer5Pointer dan Fungsi
Penerusan dengan NilaiMeneruskan Pointer ke FungsiMengubah Variabel melalui PointerContoh Klasik: SwapMeneruskan Array ke FungsiRingkasan: Argumen Pointer Fungsi8Struct dan Pointer
Pointer ke StructOperator Panah (->)Mengirim Struct berdasarkan NilaiMengirim Pointer StructAlokasi Dinamis StructUlasan: Memodifikasi Struct dengan Pointer11Tantangan Rangkuman Akhir
Rangkuman: Penggabungan string DinamisRangkuman: array berisi structRangkuman: Penghitung Frekuensi Kata3Array char dan String
String sebagai array charPenanda akhir nullInput String dengan scanfMenggunakan strlen()Menggunakan strcpy()Menggunakan strcat()Menggunakan strcmp()Ulasan: Fungsi String DasarLatihan sendiri: Compiler C online