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.
Tantangan
MudahMari 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 structProductdengan tiga anggota:char name[50],double price, danint quantity. Deklarasikan juga dua fungsi:display_by_value: menerimaProductberdasarkan nilai dan mencetak informasinyadisplay_by_pointer: menerimaconst Product *dan mencetak informasi yang sama
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: 5Coba 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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar Pemrograman Modular
file headerProteksi includefile sumberFungsi StatisRingkasan: Kalkulator Modular4Enkapsulasi
Konsep Opaque PointerMendefinisikan Opaque StructGetter dan SetterValidasi pada SetterUlasan: Kotak Rahasia2Object dan method
Struct sebagai objectPointer 'self'Konsistensi constPointer vs nilaiMethod pembantuRangkuman: Pengelola Point5Proyek: Akun Bank Sederhana
Penyiapan ProyekImplementasi Akun3Siklus Hidup object
Pola KonstruktorPola DestruktorInisialisasi StackSalinan MendalamRangkuman: Pembungkus string6Pewarisan melalui Komposisi
Penyematan StructAturan Anggota PertamaMengakses Anggota ParentUpcastingRekap: Hierarki Bentuk9Proyek: Penggambar Bentuk
Ringkasan ProyekImplementasi LingkaranImplementasi Persegi PanjangPenggunaan PolimorfismeWadah BentukLatihan sendiri: Compiler C online