Tinjauan Ulang Pointer Void
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 49 dari 61.
void* adalah cara C mengatakan "pointer ke sesuatu, tetapi aku tidak memberitahumu apa." Tipe ini dapat menyimpan alamat tipe data apa pun: int, float, struct, atau apa pun. Inilah yang menjadikannya dasar untuk menulis kode generik di C.
Kendalanya, kamu tidak dapat melakukan dereferensi void* secara langsung. Compiler tidak tahu berapa banyak byte yang harus dibaca atau cara menafsirkannya. Untuk menggunakan datanya, kamu harus meng-cast-nya kembali ke tipe yang benar:
void print_int(void* data) {
int* p = (int*)data;
printf("%d\n", *p);
}
int main() {
int x = 42;
print_int(&x);
return 0;
}Fleksibilitas ini disertai tanggung jawab. Jika kamu melakukan cast ke tipe yang salah, compiler tidak akan menghentikanmu, tetapi programmu akan menghasilkan data yang tidak bermakna atau mengalami crash. Karena itu, fungsi generik sering memasangkan void* dengan penanda tipe (seperti enum atau flag) agar fungsi tersebut tahu cara menafsirkan data dengan benar.
Dalam pelajaran mendatang, kamu akan menggunakan void* untuk membuat container yang dapat menyimpan data dengan tipe apa pun, sehingga memungkinkan struktur data yang benar-benar dapat digunakan kembali.
Tantangan
MudahTulis fungsi bernama print_value yang menerima dua parameter: pointer void* ke data dan penanda tipe int. Fungsi ini harus menafsirkan dan mencetak data berdasarkan penanda tipe:
- Jika penanda tipe adalah
0, lakukan cast pada pointer menjadiint*dan cetak nilai integer - Jika penanda tipe adalah
1, lakukan cast pada pointer menjadifloat*dan cetak nilai float dengan 2 angka di belakang koma
Programmu akan menerima dua input:
- Penanda tipe (
0untuk integer,1untuk float) - Nilai numerik
Berdasarkan penanda tipe, simpan nilai dalam tipe variabel yang sesuai, lalu panggil print_value dengan pointer ke variabel tersebut dan penanda tipe.
Contoh output saat inputnya adalah 0 dan 42:
42Contoh output saat inputnya adalah 1 dan 3.14:
3.14Contoh output saat inputnya adalah 0 dan -17:
-17Contoh output saat inputnya adalah 1 dan 99.5:
99.50Coba sendiri
#include <stdio.h>
// TODO: Tulis fungsi print_value-mu di sini
int main() {
int type_flag;
scanf("%d", &type_flag);
if (type_flag == 0) {
int int_value;
scanf("%d", &int_value);
// TODO: Panggil print_value dengan pointer ke int_value dan penanda tipe
} else if (type_flag == 1) {
float float_value;
scanf("%f", &float_value);
// TODO: Panggil print_value dengan pointer ke float_value dan penanda tipe
}
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 Rahasia7Pointer Fungsi
Mendeklarasikan Pointer FungsiMemanggil Pointer FungsiTypedef untuk Pointer FungsiMengirim Fungsi sebagai ArgumenRangkuman: Dispatch Kalkulator10Wadah Generik
Tinjauan Ulang Pointer VoidPembungkus GenerikPertukaran GenerikPerbandingan GenerikTinjauan Ulang: Generic array2Object 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