Pointer dan Reference
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 13 dari 104.
Setelah memahami memori stack dan heap, mari pelajari alat yang memungkinkan kamu bekerja langsung dengan lokasi memori: pointer dan reference.
Pointer menyimpan alamat memori dari variabel lain. Kamu mendeklarasikannya dengan * dan mendapatkan alamat menggunakan &.
int value = 42;
int* ptr = &value; // ptr menyimpan alamat memori value
std::cout << ptr; // Menampilkan alamat memori
std::cout << *ptr; // Dereferensi: menampilkan 42Reference adalah alias untuk variabel yang sudah ada. Setelah terikat, reference selalu merujuk ke variabel tersebut. Kamu mendeklarasikannya dengan &.
int value = 42;
int& ref = value; // ref adalah alias untuk value
ref = 100; // Mengubah value menjadi 100
std::cout << value; // Menampilkan 100Perbedaan utama:
| Pointer | Reference |
|---|---|
| Bisa bernilai null | Harus diinisialisasi |
| Bisa ditetapkan ulang | Tidak bisa diikat ulang |
Gunakan * untuk mengakses nilai | Akses nilai secara langsung |
| Bisa menunjuk ke apa pun | Selalu valid |
Keduanya penting agar kamu dapat mengirimkan object ke fungsi secara efisien tanpa menyalinnya, serta bekerja dengan memori yang dialokasikan di heap. Reference lebih aman dan sederhana, sedangkan pointer menawarkan lebih banyak fleksibilitas saat kamu perlu menetapkan ulang atau memeriksa apakah nilainya null.
Tantangan
MudahMari buat sistem manipulasi nilai sederhana yang menunjukkan perbedaan cara kerja pointer dan reference saat memodifikasi data.
Kamu akan membuat dua file untuk mengatur kodemu:
ValueOps.h: Definisikan tiga fungsi yang memodifikasi nilai integer dengan cara berbeda:doubleByPointer(int* ptr): menerima pointer dan menggandakan nilai yang ditunjuknyatripleByReference(int& ref): menerima reference dan melipatgandakan nilai sebanyak tiga kaliswapValues(int* a, int* b): menerima dua pointer dan menukar nilai yang ditunjuknya
main.cpp: Baca dua integer dari input, lalu tunjukkan cara kerja pointer dan reference:- Cetak nilai awal:
"Original: <first> <second>" - Gunakan
doubleByPointerpada nilai pertama, lalu cetak:"After double: <first>" - Gunakan
tripleByReferencepada nilai kedua, lalu cetak:"After triple: <second>" - Gunakan
swapValuesuntuk menukar kedua nilai, lalu cetak:"After swap: <first> <second>"
- Cetak nilai awal:
Saat memanggil fungsi dengan pointer, ingat untuk menggunakan operator address-of (&) untuk meneruskan alamat variabel. Reference bekerja lebih alami, cukup teruskan variabel secara langsung.
Sertakan file header-mu di main.cpp menggunakan #include "ValueOps.h".
Coba sendiri
#include <iostream>
#include "ValueOps.h"
using namespace std;
int main() {
// Baca dua bilangan bulat dari input
int first, second;
cin >> first;
cin >> second;
// Cetak nilai awal
cout << "Original: " << first << " " << second << endl;
// TODO: Gunakan doubleByPointer pada nilai pertama (teruskan alamat menggunakan &)
// TODO: Cetak nilai setelah digandakan
// TODO: Gunakan tripleByReference pada nilai kedua (teruskan variabel secara langsung)
// TODO: Cetak nilai setelah dilipatgandakan tiga kali
// TODO: Gunakan swapValues untuk menukar kedua nilai (teruskan alamat menggunakan &)
// TODO: Cetak nilai setelah ditukar
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online