Pengertian Pointer C++
Pointer adalah suatu variabel petunjuk yang menunjuk pada suatu alamat memori komputer tertentu. Pointer merupakan variabel level rendah yang dapat digunakan untuk menunjuk nilai integer, character, float, double atau single, dan bahkan tipe-tipe data lain yang didukung oleh bahasa C.
Variabel biasa, sifatnya statis dan sudah pasti, sedangkan pada pointer sifatnya dinamis dan dapat lebih fleksibel. Variabel pointer yang tidak menunjuk pada nilai apapun berarti memiliki nilai NULL dan disebut sebagai dangling pointer karena nilainya tidak diinisialisasi dan tidak dapat diprediksi.
Pointer dapat dikatakan sebagai suatu variabel yag menyimpan alamat memori. Pada bab-bab sebelumnya kita sudah terbiasa dengan penggunaan variabel, tapi variabel-variabel tersebut hanya berisi nilai, bukan alamat.
Jika kita mempunyai sebuah variabel dengan tipe data tertentu maka untuk mendapatkan alamat dari variabel dengan tipe data tertentu maka untuk mendapatkan alamat dari variabel tersebut adalah dengan menggunakan operator & .
Alamat inilah yang kemudian akan disimpan ke dalam variabel yang bertipe pointer. Sedangkan untuk mendeklarasika variabel sebagai ponter, kita hanya menambahkan tanda asterisk (*) di depan nama variabel. Berikut ini bentuk umum dari pendeklarasian variabel yang bertipe pointer.
tipe_data *nama_pointer; //atau
tipe_data * nama_pointer; //atau
tipe_data* nama_pointer; //atau
tipe_data * nama_pointer; //atau
tipe_data* nama_pointer; //atau
Tipe data di atas berguna untuk menyatakan bahwa pointer yang kita deklarasikan tersebut akan ditempati oleh data dengan tipe tertentu. Sebagai contoh, kita akan mendeklarasikan pointer yang akan ditempati oleh tipe data log, maka bentuk pendeklarasiannya adalah sebagai berikut :
long *P; //mendeklarasikan pointer P menunjuk ke tipe long integer
Jika kita mempunyai sebuah variabel yang bertipe log (misalnya X), maka kita dapat memerintahkan pointer P di atas untuk menunjuk ke alamat yang ditempati oleh variabel X. adapun sintaks untuk melakukan hal tersebut adalah seperti yang terlihat dibawah ini
long X; //Mendeklarasikan variabel X bertipe long integer
long *P; //Mendeklarasikan pointer P menunjuk ke tipe long integer
long &X; //Memerintah P untuk menunjuk alamat dari variabel X
Apabila kita analisis potongan sintaks di atas, sebenarnya konsep sangat sederhana. Kita tahu bahwa P adalah pointer (berisi alamat) dan &X juga berisi alamat, maka kita dapat menyimpan alamat dari variabel X tersebut ke dalam pointer P. Kita tidak diizinkan untuk memasukan sebuah nilai (bukan alamt) ke dalam pointer P. Misalnya dengan menuliskan sintaks seperti berikut :
P = X; //Salah, karena X berupa nilai (bukan alamat)
Jika kita memang ingin mengisikan nilai ke dalam alamat yang disimpan oleh pointer P, maka seharusnya kita menggunakan tanda asterisk (*) didepan nama pointer tersebut, yaitu dengan mengubah sintaks di atas mejadi seperti dibawah.
*P = X; //Benar, karena *P adalah nilai yang berada pada pointer P
Sebagai catatan bahwa *P ini disebut dengan dereference pointer. Untuk dapat lebih memahami konsep pointer. Berikut ini gambaran yang mengilustrasikan kasus diatas.
pada gambar di atas alamat 1 dari memori ditempatkan oleh variabel X yang bertipe log. Adapun nilai dari variabel X tersebut adalah 10. diatas kita mempunyai P yang menunjuk ke alamat X, maka untuk mendapatkan nilai X kita dapat menggunakan deference pointer, yaitu *P. dengan demikian dapat disimpulkan bahwa jika :
P = &X; //Keduanya menyimpan alamat
*P = X; //Keduanya menyimpan nilai
⇛ Memasukan nilai pada pointer
Nilai yang dimaksud tentu berupa alamat, bukan berupa nilai data. walaupun tampak mudah tapi kita juga harus berhati-hati dalam melakukan hal ini. Perlu diperhatikan bahwa tipe data dari pointer harus sama dengan tipe data dari vairabel yang akan menempatinya.
Hal ini merupakan hal yang biasa terabaikan oleh para programmer pemula. Misalnya kita mendeklarasikan pointer P ke tipe double dan kita juga memiliki variabel X yang bertipe int. pada kasus ini kita tidak diijinkan untuk menyimpan alamat dari variabel X ke pointer P karena tipenya berbeda.
Contoh :
double P;
int X; //Mendefinisikan variabel bertipe int
P = &X; /*Salah, karena P hanya menyimpan alamat dari variabel-variabel
yang bertipe double saja*/
int X; //Mendefinisikan variabel bertipe int
P = &X; /*Salah, karena P hanya menyimpan alamat dari variabel-variabel
yang bertipe double saja*/
⇛ Menggunakan kata kunci New
Untuk mengalokasikan memori pada ruang yang masih kosong menggunakan kata kunci new. Kata kunci ini akan diikuti oleh tipe data yang akan dialokasikan sehingga kompiler akan mengetahui seberapa besar ruang memori yang dibutuhkan utnuk proses pengalokasian tersebut.
Misalnya, jika mengalokasikan tipe data long, maka ruang yang dibutuhkan adalah 4 type sedangkan unsigned short hanya membutuhkan 2 byte.
Pada saat mengalokasikan memori, alamat memori yang dialokasikan tersebut akan disimpan ke pointer, sehingga sebelumnya harus dideklarasikan pointer terlebih dahulu. Struktur penulisan penggunaan kata kunci new adalah sebagai berikut:
Nama_pointer = new tipe_data;
Tapi jika ingin mengalokasikan beberapa ruang memori, misalnya akan mengalokasikan 10 buah memori dengan menggunakan tipe data long (berukutan 4 byte) maka memori yang dibutuhkan adalah 10x4-40 byte.
Adapun bentuk penulisan :
Nama_pointer = new tipe_data[n];
⇛ Menghapus pointer
Memori yang sudah tidak digunakan lagi dapat dihapus agar tidak memborosi memori komputer. Struktur penulisan penggunaan kata kunci delete adalah :
delete nama_pointer;
Operator Pointer
Operasi penugasanNilai dari suatu variabel pointer dapat disalin ke variabel pointer yang lain
Contoh :
y = 35;
x1 = &y;
x2 = x1;
Operasi aritmatika
- Suatu variabel pointer hanya dapat dilakukan operasi aritmatika dengan nilai integer saja
- Operasi yang biasa dilakukan alalah operasi penambahan dan pengurangan.
- Operasi penambahan dengan suatu nilai menunjukan lokasi data berikutnya (index selanjutnya) dalam memori.
Contoh Program
Contoh 1. Menampilkan nilai dan alamatnya
Source code :
Berikut ini adalah contoh program yang menggunakan pointer dapat menyimpan alamat dari variabel-variabel yang bertipe apapun
#include <iostream>
using namespace std;
main(){
long *P;
long X;
P=&X;
X=10; //Mengisikna nilai 10 ke dalma variabel X
cout<<"Nilai X : "<<X<<endl;
cout<<"Nilai *P : "<<*P<<endl;
cout<<"Nilai P : "<<P<<endl;
cout<<"Nilai &X : "<<&X<<endl;
*P=200; //Mengisikan nilai 200 ke dalam *P
cout<<"Nilai X : "<<X<<endl;
cout<<"Nilai *P : "<<*P<<endl;
cout<<"Nilai P : "<<P<<endl;
cout<<"Nilai &X : "<<&X<<endl;
return 0;
}
Running program :
Contoh 2. Pointer tanpa tipe data
Source code :
#include <iostream>
using namespace std;
int main(){
void *P; //Mendeklarasikan pointer P
//sebagai pointer tanpa tipe
//Mendeklarasikan variabel X, Y dan Z dengan tipe berbeda
int X;
long Y;
double Z;
//Memerintahkan P untuk menunjuk ke alamat dari variabel X
P=&X;
X=10; //Mengisikan variabel X dengan nilai 10
//Menampilkan hasil
cout<<"Nilai X : "<<X<<endl;
cout<<"Nilai P : "<<P<<endl;
cout<<"Nilai &X : "<<&X<<endl;
cout<<endl;
//Memerintah P untuk menunjuk ke alamat dari variabel Y
P=&Y;
Y=2000; //Mengisikan variabel Y dengan nilai 2000
//Menampilkan hasil
cout<<"Nilai Y : "<<Y<<endl;
cout<<"Nilai P : "<<P<<endl;
cout<<"Nilai &Y : "<<&Y<<endl;
cout<<endl;
//Memerintahkan P untuk menunjuk ke alamat dari variabel Z
P=&Z;
Z=21.0378; //Mengisikan variabel Z dengan nilai 21.0378
//Menampilkan hasil
cout<<"Nilai Z : "<<Z<<endl;
cout<<"Nilai P : "<<P<<endl;
cout<<"Nilai &Z : "<<&Z<<endl;
cout<<endl;
return 0;
}
Running program :
Contoh 3. Menggunakan kata kunci new
#include <iostream>
#define MAX 5
using namespace std;
main(){
float *P1;
int *P2;
P1=new float; //Mengalokasikan satu ruang memori dan disimpan ke pointer P1
*P1=3.14; //Mengisikan nilai ke dalam ruang yang telah dialokasikan
//Menampilkan nilai dan alamat yang disimpan dalma pointer P1
cout<<"Nilai *P1 : "<<*P1<<endl;
cout<<"Nilai P1 : "<<P1<<endl;
cout<<endl;
//Mengalokasikan 5 buah ruang memori dan disimpan ke pointer P2
P2=new int[MAX];
//Mengisikan nilai ke dalam ruang-ruang memori yang telah dialokasikan
for (int C=0; C<5; C++)
{
*P2=(C+1) *10;
P2 += 1;
}
//Menghasilkan pointer P2 agar menunjuk ke alamat dari elemen ke-0
P2-=5;
//Menampilkan nilai dan alamat yang disimpan dalam pointer P2
for(int c=0; c<5; c++)
{
cout<<"Nilai *P2 ke-"<<c<<" : "<<*P2<<endl;
cout<<"Nilai P2 ke-"<<c<<" : "<<P2<<endl<<endl;
P2+=1;
}
}
Running program :
Contoh 4. Menggunakan kata kunci delete
#include <iostream>
using namespace std;
main (){
int *P; //Mendeklarasikan pointer P yang menunjuk ke tipe data int
//Melakukan alokasi memori
P=new int;
//Menggunakan memori yang telah dialokasikan
*P=100;
cout<<"Nilai *P : "<<*P<<endl;
//Melakukan dealokasi memori
delete P;
return 0;
}
Running program :
Contoh 5. Cobalah program berikut, jalankan dan analisis hasilnya
#include <iostream>
using namespace std;
main(){
int nil1=5, nil2=15;
int *ptr;
ptr=&nil1;
*ptr=10;
ptr=&nil2;
*ptr=20;
cout<<"nilai 1 = "<<nil1<<" dan nilai 2 = "<<nil2<<endl;
}
Running program :
Contoh 6. Operasi pada pointer
#include <iostream>
using namespace std;
main(){
float nilai, *p1, *p2;
nilai=14.54;
cout<<"Nilai = "<<nilai<<", alamatnya "<<&nilai;
p1=&nilai;
p2=p1; //operasi pemberian nilai, berarti alamat x2 sama dengan x1
cout<<"\nNilai p1 = "<<*p2<<", p1 menunjuk alamat "<<p1;
//pada awalnya p2 masih dangling pointer
cout<<"\nMula-mula nilai p2 = "<<*p2<<", p2 menunjuk alamat "<<p2;
cout<<"\nSekarang nilai p2 = "<<*p2<<", p2 menunjuk alamat "<<p2;
cout<<endl;
}
Running program :
Contoh 7. Cobalah program operasi logika berikut ini
#include <iostream>
using namespace std;
main(){
int nilai[3], *penunjuk;
nilai[0] = 125;
nilai[1] = 345;
nilai[2] = 750;
penunjuk = &nilai[0];
cout<<"Nilai "<<*penunjuk <<" ada di alamat memori "<<penunjuk;
cout<<"\nNilai "<<*(penunjuk+1)<<" ada di alamat memori "<<penunjuk+1;
cout<<"\nNilai "<<*(penunjuk+2)<<" ada di alamat memori "<<penunjuk+2<<endl;
}
Running program :
Contoh 8. Cobalah program operasi logika berikut ini
#include <iostream>
using namespace std;
main(){
int *pa, *pb, a=100, b=10;
pa=&a;
pb=&b;
if(*pa<*pb)
{
cout<<"pa menunjuk ke memori lebih RENDAH dari pb\n";
}else if(*pa==*pb)
{
cout<<"pa menunjuk ke memori yang SAMA dengan pb\n";
}else if (*pa>*pb)
{
cout<<"pa menunjuk ke memori lebih Tinggi dari pb\n";
}
}
Running program :
Contoh 9. Mencoba program pointer dan array berikut
#include <iostream>
using namespace std;
main(){
char array[5];
char* p;
p=array;
*p='a';
p++;
*p='b';
p=&array[2]; *p='c';
p=array+3; *p='d';
p=array;*(p+4) ='e';
for (int n=0; n<5; n++)
cout<<array[n]<<", ";
cout<<endl;
}
Running program :
Contoh 10. Cobalah program pointer dan array berikut ini
#include <iostream>
using namespace std;
const int array =5;
main(){
int A [array];
const int *pInt=A;
for (int i=0; i<array; i++)
{
cout<<"Input array : ";cin>>A[i];
}
for (int n=0; n<array; n++)
{
cout<<"Element ["<<n<<"] = "<<*(pInt)<<endl;
pInt++;
}
}
Running program :
Tugas
- Buatlah program yang menggunakan pointer. Program tersebut juga mempunyai sub program (fungsi atau prosedur). Boleh memodifikasi program pada bagian latihan.
Jawaban
Akan segera di Upload