Menu
CoddyTech

Pointer vs nilai

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 9 dari 61.

Saat kamu meneruskan struct ke fungsi, C memberimu dua pilihan: meneruskannya berdasarkan nilai (menyalin seluruh struct) atau meneruskannya melalui pointer (hanya menyalin alamatnya). Pilihan ini sangat berpengaruh terhadap performa.

Passing by value membuat salinan lengkap struct di stack. Untuk struct kecil dengan beberapa bilangan bulat, ini tidak masalah. Namun, bayangkan struct berukuran ratusan byte: setiap pemanggilan fungsi menyalin semua data tersebut:

typedef struct {
    char name[100];
    int scores[50];
    double average;
} Student;

// Dengan nilai: menyalin ~308 byte setiap kali dipanggil
void print_by_value(Student s) {
    printf("%s: %.2f\n", s.name, s.average);
}

// Dengan pointer: hanya menyalin 8 byte (alamatnya)
void print_by_pointer(const Student *s) {
    printf("%s: %.2f\n", s->name, s->average);
}

Sintaksnya juga berbeda. Dengan parameter nilai, kamu menggunakan operator titik (s.name). Dengan pointer, kamu menggunakan operator panah (s->name).

Versi pointer lebih efisien karena hanya meneruskan alamat memori, biasanya 8 byte terlepas dari ukuran struct.

Inilah alasan pemrogram C hampir selalu meneruskan struct menggunakan pointer. Gunakan const saat fungsi tidak boleh mengubah data, dan gunakan pointer biasa saat fungsi boleh mengubahnya. Dengan begitu, kamu mendapatkan efisiensi dan tujuan yang jelas.

challenge icon

Tantangan

Mudah

Mari buat module Product yang menunjukkan perbedaan antara mengirim struct berdasarkan nilai dan berdasarkan pointer. Kamu akan membuat dua fungsi display: satu menerima seluruh struct sebagai salinan, dan satu lagi hanya menerima pointer ke struct tersebut.

Kamu akan membuat tiga file:

  • product.h: Deklarasikan struct Product dengan tiga anggota: char name[50], double price, dan int quantity. Deklarasikan juga dua fungsi:
    • display_by_value: menerima Product berdasarkan nilai dan mencetak informasinya
    • display_by_pointer: menerima const Product * dan mencetak informasi yang sama
    Gunakan include guard dengan simbol PRODUCT_H.
  • product.c: Implementasikan kedua fungsi. Perhatikan perbedaan sintaks: versi yang menerima nilai menggunakan operator titik (p.name), sedangkan versi yang menerima pointer menggunakan operator panah (p->name). Kedua fungsi harus mencetak dengan format yang sama.
  • main.c: Buat sebuah Product, lalu panggil kedua fungsi display untuk menunjukkan bahwa keduanya menghasilkan output yang sama meskipun menggunakan gaya parameter yang berbeda.

Kamu akan menerima tiga input: nama produk (sebuah string), harga (sebuah double), dan jumlah (sebuah integer).

Di file main-mu, inisialisasi Product dengan nilai-nilai ini, lalu panggil display_by_value diikuti oleh display_by_pointer.

Kedua fungsi harus mencetak dengan format berikut:

Product: {name}, Price: {price}, Qty: {quantity}

Gunakan %.2f untuk harga agar menampilkan dua angka desimal.

Contohnya, dengan input Laptop, 999.99, dan 5, outputnya adalah:

Product: Laptop, Price: 999.99, Qty: 5
Product: Laptop, Price: 999.99, Qty: 5

Coba sendiri

#include <stdio.h>
#include <string.h>
#include "product.h"

int main() {
    char name[50];
    double price;
    int quantity;
    
    // Baca input
    scanf("%s", name);
    scanf("%lf", &price);
    scanf("%d", &quantity);
    
    // TODO: Buat variabel Product dan inisialisasi dengan nilai input
    // Petunjuk: Gunakan strcpy untuk menyalin nama ke field name pada struct
    
    // TODO: Panggil display_by_value dengan Product
    
    // TODO: Panggil display_by_pointer dengan pointer ke Product
    
    return 0;
}
quiz iconUji dirimu

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

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C online