Substansi:
- Pengertian Pointer
- Operator Pointer
- Mendeklarasikan Variabel Pointer
- Pointer Pada Pointer
- Pointer Pada Array
- Pointer pada String

Pointer Dalam C++
1. Pengertian Pointer
Pointer adalah suatu variabel penunjuk, berisi nilai yang menunjuk alamat suatu lokasi memori tertentu. Jadi pointer tidak berisi nilai data, melainkan berisi suatu alamat memori. Lokasi memori tersebut bisa diwakili sebuah variabel atau juga berupa alamat memori secara langsung.
2. Operator Pointer
Ada dua operator yang digunakan pada tipe data pointer yaitu:
a. Operator Deference (&)
Operator ini biasanya disebut dengan address of atau operator alamat. Dengan menggunakan operator deference (&) ini, suatu variabel akan menghasilkan alamat memori.
Contoh:
int x = 45;
cout << &x;
Pada program di atas, akan ditampilkan alamat memori dari variabel x, bukan nilai x.
b. Operator reference (*)
Operator ini biasanya disebut value pointed by. Dengan menggunakan operator ini, kita dapat mengakses secara langsung nilai yang terdapat pada suatu alamat memori.
Contoh:
int x = 45;
cout <<*&x;
Pada program di atas, akan ditampilkan nilai dari alamt memori &x.
3. Mendeklarasikan Variabel Pointer
Suatu variabel pointer didefinisikan dengan bentuk sebagai berikut:
tipe_data *nama_variabel
- tipe_data dapat berupa sembarang tipe seperti halnya pada pendefinisian variabel bukan pointer.
- nama_variabel adalah nama variabel pointer.
Contoh1:
#include <iostream.h>
#include <conio.h>
void main() {
int x, y; int *px;
x = 89;
y = x;
px = &x;
cout << "Nilai x = " << x << endl;
cout << "Nilai y = " << y << endl;
cout << "Alamat px = " << px << endl;
cout << "Nilai px = " << *px << endl;
getch();
}
Output:
Nilai x = 89
Nilai y = 89
Alamat px = 0x0012ff88
Nilai px = 89
Contoh2:
#include <iostream.h>
#include <conio.h>
void main() {
int x, y;
int *px;
x = 89;
y = x;
px = &x;
cout << "Nilai x = " << x << endl;
cout << "Nilai y = " << y << endl;
cout << "Alamat x = " << &x << endl;
cout << "Alamat px = " << px << endl;
cout << "Nilai px = " << *px << endl;
x = 108;
cout << "\nNilai x = " << x << endl;
cout << "Nilai y = " << y << endl;
cout << "Alamat x = " << &x << endl;
cout << "Alamat px = " << px << endl;
cout << "Nilai px = " << *px << endl;
*px = 123;
cout << "\nNilai x = " << x << endl;
cout << "Nilai y = " << y << endl;
cout << "Alamat x = " << &x << endl;
cout << "Alamat px = " << px << endl;
cout << "Nilai px = " << *px << endl;
getch();
}
Output:
Nilai x = 89
Nilai y = 89
Alamat x = 0x0012ff88
Alamat px = 0x0012ff88
Nilai px = 89
Nilai x = 108
Nilai y = 89
Alamat x = 0x0012ff88
Alamat px = 0x0012ff88
Nilai px = 108
Nilai x = 123
Nilai y = 89
Alamat x = 0x0012ff88
Alamat px = 0x0012ff88
Nilai px = 123
4. Pointer Pada Pointer
Tidak terbatas menunjuk alamat dari suatu variabel, pointer dapat pula menunjuk ke pointer lainnya. Dalam pendeklarasiannya, kita tambahkan pointer reference (*) pada variabel yang akan ditunjuk.
Contoh:
int x;
int *px; //pointer ke variabel int
**ppx; //pointer pada pointer
x = 100;
px = &nama;
ppx = &pNama;
Contoh Program:
#include <iostream.h>
#include <conio.h>
void main() {
int x;
int *px; //pointer ke variabel
int **ppx; //pointer ke pointer
x = 175;
px = &x;
ppx = &px;
cout << "Nilai x = " << x << endl;
cout << "Nilai px = " << *px << endl;
cout << "Nilai ppx = " << **ppx << endl;
getch();
}
Output:
Nilai x = 175
Nilai px = 175
Nilai ppx = 0x0012ff88
5. Pointer Pada Array
Pada Array/Larik, pointer hanya perlu menunjukan alamat elemen pertama saja karena alamat array dalam memori sudah disusun secara berurutan.
Contoh:
int a[] = {76, 67, 88, 98};
int *pa;
pa = a;
Pernyataan pa=a artinya pointer pa menyimpan alamat array a, yang alamatnya diwakili alamat elemen pertama, yaitu a[0]. Kita juga bisa mengganti perintah pa=a dengan pa=&a[0]. Untuk pembacaan semua elemen array dengan pointer, bisa menggunakan perulangan seperti pada penggalan program berikut.
for (int i=0; i < 4; i++) {
cout << *pa << " ";
pa++;
}
Contoh Program:
#include <iostream.h>
#include <conio.h>
#define MAX 5
void main() {
int a[MAX];
int *pa; pa = a; //atau pa = &a[0]
for (int i = 0; i < MAX; i++) {
cout << "Masukkan Nilai " << i+1 << " : ";
cin >> a[i];
}
cout << endl;
for (int i = 0; i < MAX; i++) {
cout << "Nilai a[" << i << "] = " << *pa << endl;
pa++;
}
getch();
}
Output:
Masukkan Nilai 1 : 100
Masukkan Nilai 2 : 120
Masukkan Nilai 3 : 50
Masukkan Nilai 4 : 111
Masukkan Nilai 5 : 47
Nilai a[0] = 100
Nilai a[1] = 120
Nilai a[2] = 50
Nilai a[3] = 111
Nilai a[4] = 47
6. Pointer pada String
Pointer pada string dapat anda lihat pada contoh program berikut:
#include <iostream.h>
#include <conio.h>
#define MAX 5
void main() {
char nama[] = "Albert Einstein";
char *pNama = nama;
cout << "Nama = " << nama << endl;
cout << "pNama = " << pNama << endl;
pNama += 7; cout << "\nSetelah pNama += 7" << endl;
cout << "Nama = " << nama << endl;
cout << "pNama = " << pNama << endl;
getch();
}
Output:
Nama = Albert Einstein
pNama = Albert Einstein
Setelah pNama += 7
Nama = Albert Einstein
pNama = Einstein
Sumber:
Modul Praktikum Pemrograman Sistem. STMIK El Rahma Yogyakarta. Oleh Eding Muh. Saprudin, S.Kom
Catatan Versi Lain
Bahasa C++ membolehkan kita untuk memanipulasi memori dengan cara penggunaan pointer. Hal ini merupakan fitur yang tidak disediakan oleh bahasa pemrograman yang lain. Apabila digunakan secara benar maka akan sangat menguntungkan, tetapi bila salah dalam penggunaan bisa berakibat pada kerusakan (crash atau hang) pada sistem operasi.
1. Konsep dan Pengertian Pointer
Pointer adalah variabel. Namun berbeda dengan variabel normal, pointer menyimpan alamat pada memori, bukan nilai yang kita masukkan. Perhatikan contoh berikut.
Contoh 9.20. Mendeklarasikan pointer
#include <iostream>
using namespace std;
int main() { long *Alamat; long X;
Alamat = &X;
X = 5; // Mengisikan nilai 5 ke dalam variabel X
cout<<"Nilai X : "<<X<<endl; cout<<"Nilai *Alamat : "<<*Alamat<<endl; cout<<"Nilai Alamat : "<<Alamat<<endl;
cout<<"Nilai &X : "<<&X<<endl;
*Alamat = 20; // Mengisikan nilai 20 ke dalam *Alamat
cout<<"Nilai X : "<<X<<endl; cout<<"Nilai *Alamat : "<<*Alamat<<endl; cout<<"Nilai Alamat : "<<Alamat<<endl; cout<<"Nilai &X : "<<&X<<endl;
return 0; }
Pada contoh di atas, kita deklarasikan variabel alamat sebagai pointer dengan menambahkan tanda * di depan nama variabel. Jika kita tidak menggunakan tanda * berarti variabel tersebut akan berfungsi seperti variabel normal. Variabel X kita deklarasikan sebagai variabel normal dengan tipe data long. Perhatikan pada baris Alamat = &X. Baris ini menyatakan bahwa variabel Alamat (bukan pointer) akan diisi dengan nilai dari alamat dari X. Tanda & di depan nama variabel berarti kita menginginkan nilai alamat memorinya yang kita gunakan dan bukan nilainya. Apabila kita eksekusi programnya maka tampilannya akan tampak seperti pada Gambar 9.4.

Gambar 9.4. Hasil eksekusi deklarasi pointer
Perhatikan nilai-nilai output pada Gambar 9.4. Nilai seperti 0x22ff88 adalah angka hexadesimal dari alamat variabel. Kalau kalian amati, ketika kita memasukkan nilai 5 pada variabel X maka variabel *Alamat akan berisi juga nilai 5. Demikian juga ketika kita memasukkan nilai 20 pada variabel *Alamat , nilai X juga berubah menjadi 20. Hal ini karena variabel *Alamat dan X menempati alamat memori yang sama.
Setiap kali kita mendeklarasikan sebuah pointer, maka otomatis pointer akan menunjuk alamat acak pada memori. Oleh karena itu kita harus mengeset variabel pointer tersebut agar tidak menunjuk alamat tertentu dengan cara memberi nilai NULL. Perhatikan contoh kode berikut dan hasil eksekusinya (Gambar 9.5).
Contoh 9.21. Mendeklarasikan pointer dengan NULL
#include <iostream>
using namespace std;
int main() { long *Alamat; long *Alamat1;
Alamat = NULL;
cout<<"Alamat memori yang ditunjuk dengan NULL :
"<<Alamat<<endl; cout<<"Alamat memori yang ditunjuk tanpa NULL :
"<<Alamat1<<endl;
return 0; }

Gambar 9.5. Hasil eksekusi pointer NULL
2. Penggunaan New dan Delete pada Pointer
Kata kunci New dapat digunakan untuk mengalokasikan memori pada ruang yang masih kosong. Kata kunci ini diikuti oleh tipe data yang akan dialokasikan sehingga compiler akan mengetahui seberapa besar memori yang akan dialokasikan. Sedangkan delete merupakan kebalikan dari new. Delete akan membebaskan memori dari variabel yang kita gunakan. Perintah delete ini sangat penting, karena apabila kita tidak membebaskan memori dari penggunaan maka akan sangat memboroskan pemakaian memori dan pada akhirnya akan membuat sistem berjalan tidak semestinya. Perhatikan contoh penggunaan new dan delete berikut ini.
Contoh 9.22. Penggunaan new dan delete
#include <iostream>
using namespace std;
int main() { int *Alamat;
// Melakukan alokasi memori
Alamat = new int;
// Menggunakan memori yang telah dialokasikan
*Alamat = 100;
cout<<"Nilai *Alamat : "<<*Alamat<<endl;
// membebaskan memori delete Alamat;
return 0; }
Semoga bermanfaat & selamat belajar!