Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Buat program C yang menunjukkan cara meneruskan pointer ke struct ke fungsi agar data dapat diubah secara efisien. Programmu harus:

  1. Mendefinisikan struct bernama BankAccount dengan anggota berikut:
    • Integer accountNumber untuk menyimpan nomor rekening
    • Array karakter ownerName berukuran 30 untuk menyimpan nama pemilik rekening
    • Float balance untuk menyimpan saldo rekening
    • Integer transactionCount untuk menyimpan jumlah transaksi
  2. Menulis fungsi bernama depositMoney yang:
    • Menerima pointer ke struct BankAccount dan jumlah float sebagai parameter
    • Menambahkan jumlah tersebut ke saldo rekening menggunakan operator panah
    • Menambah jumlah transaksi sebesar 1
    • Mencetak Deposit successful. New balance: [balance]
  3. Menulis fungsi bernama withdrawMoney yang:
    • Menerima pointer ke struct BankAccount dan 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]
  4. Menulis fungsi bernama displayAccount yang:
    • Menerima pointer ke struct BankAccount sebagai parameter
    • Mencetak informasi rekening dengan format persis seperti berikut:
      • Account Information:
      • Account Number: [accountNumber]
      • Owner: [ownerName]
      • Balance: [balance]
      • Transactions: [transactionCount]
  5. Di fungsi main:
    • Membuat variabel BankAccount bernama account
    • Membaca nomor rekening, nama pemilik, dan saldo awal dari input
    • Mengatur jumlah transaksi menjadi 0
    • Memanggil displayAccount untuk menampilkan keadaan awal rekening
    • Membaca jumlah deposit dan memanggil depositMoney
    • Membaca jumlah penarikan dan memanggil withdrawMoney
    • Memanggil displayAccount untuk menampilkan keadaan akhir rekening

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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler C online