Selasa, 26 Februari 2019

POINTER DALAM C++

1ALAMAT DAN POINTER
Pointer adalah variabel yang berisi  alamat dari variabel yang memiliki nilai tertentu. Konsep dari pointer sebenarnya tidak sekompleks yang diduga oleh beberapa orang. Pointer sesungguhnya berisi alamat suatu data, bukan data sebagaimana pada variable yang telah dikenal.
Seperti diketahui, setiap byte di dalam memori computer memiliki alamat.  Alamat memori dimulai dari 0. Didalam memori inilah variable disimpan.  Namun, tentu saja program tidak perlu menyebutkan alamat suatu variable secara eksplisit. Pada saat program dimuat didalam memori, variable akan diletakkan dengan sendirinya pada alamat tertentu.
Suatu pointer didalam program dimaksudkan untuk menunjuk ke suatu alamat memori. Sebagai contoh pada gambar di bawah ini, kalau pint adalah pointer, dan vint adalah variable yang terletak didalam memori beralamat 0x28fee8,  pointer  pint dapat diatur agar menunjuk ke variable vint

2.  MENGETAHUI ALAMAT SUATU VARIABEL


Alamat suatu variable dapat diketahui dengan mudah. Caranya ialah dengan menambahkan operator alamat, berupa simbol &, didepan nama variable. Dengan mengirimkan ke cout, alamat suatu variable akan ditampilkan ke layar.
Program alifbata.cpp memperlihatkan adanya tiga deklarasi variable bernama alif, ba dan ta. Alamat ketiga variable ini ditampilkan melalui satu cout. Alamat diperoleh dengan menambahkan tanda & didepan nama variable.
Input :


#include<iostream>
using namespace std;
int main()
{
    int alif = 5;
    float ba = 7.5;
    double ta = 17.777;

    cout<<" Isi Variabel = "<<endl;
    cout<<" alif         = "<<alif<<endl;
    cout<<" ba           = "<<ba<<endl;
    cout<<" ta           = "<<ta<<endl;
    cout<<endl;

    cout<<" Isi Variabel = "<<endl;
    cout<<" alif         = "<<&alif<<endl;
    cout<<" ba           = "<<&ba<<endl;
    cout<<" ta           = "<<&ta<<endl;

    return 0;
}
 

Output :


  

3.  DEKLARASI VARIABEL POINTER

Suatu variable pointer dideklarasikan dengan bentuk seperti berikut :
tipe_data nama_variabel
Dalam hal ini:
·         tipe_data dapat berupa sembarang tipe seperti halnya pada deklarasi variable bukan pointer;
·         nama_variabel adalah nama variable pointer
Beberapa contoh deklarasi variable pointer :
     int *pint; //pointer ke int
     char *pch; //pointer ke char
     float *pfl; //pointer ke float
Beberapa variable pointer dapat dideklarasikan dengan sebuah pernyataan.
 Contoh :
     char *pch1, pch2;
Mendeklarasikan :
·         pch1 : pointer yang menunjuk ke data bertipe char.
·         Pch2 : pointer yang menunjuk ke data bertipe char.

4.  MENGISI VARIABLE POINTER

Supaya suatu variabel pointer menunjuk ke variabel lain, mula-mula harus diisi dengan alamat variabel yang hendak ditunjuk. Sebagai contoh, terdapat deklarasi seperti berikut :
Int vint = 35;
Int *pint;
Variabel pointer pint dapat diatur agar menunjuk ke vint dengan cara seperti berikut :
            pint = &vint;
Pernyataan diatas berarti : *pint diisi dengan alamat vint”. Operator & menyatakan “alamat dari”. Sekarang, lihatlah program berikut yang mendeklarasikan variabel pointer, mengisinya dengan alamat suatu variabel, dan menampilkan isi pointer.
Input :
#include<iostream>
using namespace std;
int main()
{
    int vint = 55;
    int *pint;
    pint = &vint;
    cout<<"Alamat Vint = "<<&vint<<endl;
    cout<<"pint = "<<pint<<endl;
    return 0;
}
Output :

 5. MENGAKSES NILAI YANG DITUNJUK POINTER


Berdasarkan contoh pada program sebelumnya, alamat vint dapat diakses melalui pint setelah pernyataan : pint =&vint; dijalankan. Persoalan berikutnya adalah, “Bagaimana nilai vint dapat diakses melalui pint ?”. Nah hal itu dilaksanakan dengan melibatkan operator “tak langsung”. Operator ini berupa symbol * dan diletakkan didepan nama variabel pointer.
 Contoh : *pint berarti “nilai yang ditunjuk oleh pint”.
Input :
 

 
#include<iostream>
using namespace std;
int main()
{
    int vint = 55;
    int *pint;
    cout<<"Isi vint semula = "<<vint<<endl;
    pint = &vint;
    *pint = 77;

    cout<<"Isi Vint sekarang = "<<vint<<endl;

    return 0;
}


Output : 
 

6.  POINTER VOID


Pada program sebelumnya  diberikan contoh beberapa variabel pointer yang menunjuk ke tipe data tertentu. Namun, sebenarnya dimungkinkan untuk membuat pointer yang tidak bertipe. Caranya adalah dengan meletakkan kunci void pada bagian penentu tipe pointer. Contoh :
            void *ptr;
Merupakan pernyataan untuk mendeklarasikan ptr sebagai variabel pointer void. Suatu pointer void adalah pointer yang dapat menunjuk keseberang tipe data. Sebagai contoh, anda dapat mengatur agar pointer ini menunjuk ke tipe data int, tetapi di saat lain diperlukan untuk menunjuk data bertipe float.

Berikut program yang menunjukkan operasi pada pointer void :
Input :


#include<iostream>
using namespace std;
int main()
{
    void *ptr;
    int vint = 50;
    cout<<"Isi vint semula = "<<vint<<endl;
    ptr = &vint;
    *(int *) ptr = 77;
    cout<<"Isi Vint sekarang = "<<vint<<endl;
    return 0;  }


Output :
 

7. POINTER DAN ARRAY


Pointer dan array mempunyai hubungan yang dekat. Secara internal, array juga menyatakan alamat. Sebagai contoh dideklarasikan : int tgl_lahir [] = {24,6,1965}; dan int *ptgl;

Agar ptgl menunjuk ke array, diperlukan pernyataan berupa : ptgl = tgl_ lahir;Perhatikan dengan seksama pernyataan diatas. Tidak ada tanda & didepan tgl_lahir.  Padahal, beberapa contoh sebelumnya menggunakan format : ptr = &variabel ,bila variabel bukan merupakan array. Hal ini disebabkan nama array sebenarnya sudah menyatakan alamat. Oleh karena itu tanda & tidak diperlukan.
Input :
#include<iostream>
using namespace std;
int main()
{
    int tgl_lahir [] = {24,6,1965};
    int *ptgl;
    ptgl = tgl_lahir;
    cout<<"Nilai yang ditunjuk ptgl = "
        <<*ptgl<<endl;
    cout<<"Nilai tgl_lahir[0]       = "
        <<tgl_lahir[0]<<endl;
    return 0;}
Output :

8. POINTER DAN STRING


Pada contoh diatas : char *ptokoh = "GatotKaca"; akan menyebabkan C++ :
·         Mengalokasikan ptokoh sebagai variabel pointer yang merujuk ke data bertipe char dan menempatkan kostanta string “Gatotkaca” kesuatu lokasi di memori komputer;
·         Kemudian ptokoh akan menunjuk kelokasi string “Gatotkaca”.
Pernyataan diatas menyerupai pernyataan : char tokoh[] = “Gatotkaca”; perbedaannya :
·         ptokoh adalah pointer yang dengan mudah dapat diatur agar menunjuk ke data string;
·         ptokoh adalah array yang menyatakan alamat yang konstan, tidak dapat diubah. Bagian yang dapat diubah adalah elemen array-nya.
Perbedaanya ditunjukkan pada program berikut :
Input :
#include<iostream>
using namespace std;

int main()
{
    char tokoh[] = "GatotKaca";
    char *ptokoh = "GatotKaca";

    cout<<" Tokoh   = " <<tokoh<<endl;
    cout<<" ptokoh  = " <<ptokoh<<endl;

    ptokoh++;

    cout<<" ptokoh  = " <<ptokoh<<endl;

    return 0;
}
Output :
 

Tampak bahwa pointer dengan mudah dapat diubah (misalnya ptokoh++). Dengan cara seperti itu, kalau semula ptokoh menunjuk “Gatotkaca”, kini menunjuk “atotkaca”.

  9. ARRAY POINTER

Satu array bisa digunakan untuk menyimpan sejumlah pointer. Contoh : string *namahari[7]; merupakan pernyataan untuk mendeklarasikan array namahari yang berisi tujuh elemen berupa pointer. Pointer tersebut menunjuk ke data bertipe string. Program berikut memperlihatkan contoh pembuatan array pointer dan cara menginisialisasinya. Kemudian, nilai yang ditunjuk oleh elemen-elemen pointer ini di tampilkan ke layar.
Input :
#include<iostream>
using namespace std;
int main()
{
    int i;
    string namahari[7] =
    {
        "senin","selasa","Rabu","Kamis",
        "Jum'at","Sabtu","Minggu"
    };
    string *phari[7];
    for (i=0; i<7; i++)
        phari[i] = &namahari[i];
    for (i=0; i<7; i++)
        cout<<*phari[i]<<endl;
    return 0;
}
Output :
 


Untuk membentuk rantai pointer, diperlukan deklarasi seperti berikut :
int var_x = 273;
int *ptr1;  //satu tanda * didepan ptr1
int **ptr2; // dua tanda * didepan ptr2
pada deklarasi diatas :
·         Var_x adalah variabel bertipe int.
·         Ptr1 adalah variabel pointer yang menunjuk ke data bertipe ptr1.
·         Ptr2 adalah variabel pointer yang menujuk ke pointer int.
Agar ptr1 menunjuk ke variabel var_x, perintah yang diperlukan berupa :
            Ptr1=var_x;
Supaya ptr2 menunjuk ke ptr1, diperlukan perintah berupa :
Ptr2 = &ptr1;
Contoh program yang memberikan gambaran pengaksesan nilai pada var_x melalui pointer ptr1 dan ptr2 adalah berikut :
Input :
#include<iostream>
using namespace std;
int main()
{
    int var_x = 273;
    int *ptr1, **ptr2;

    cout<<"var_x = "<<var_x<<endl;

    //penugasan alamat
    ptr1 = &var_x;
    ptr2 = &ptr1;

    cout<<"*ptr1  = "<<*ptr1<<endl;

    cout<<"**ptr2 = "<<**ptr2<<endl;

    return 0;
}
Output :


11.    POINTER DAN FUNGSI

a.    Pointer Sebagai Argumen Fungsi
Input :
#include<iostream>
using namespace std;
void ubah_nilai(int &pinokio);
int main()
{
    int pinokio = 80;
    cout<<"Nilai Pinokio Semula    = "
        <<pinokio<<endl;
    ubah_nilai(pinokio);
    cout<<"Nilai Pinokio sekarang  = "
        <<pinokio<<endl;
    return 0;
}
void ubah_nilai(int &x)
{
    x = 95;
}


Output : 

Dengan menuliskan & didepan argumen pada pendefinisian fungsi (dan juga tentu saja pada prototype fungsi), nilai argument dapat diubah didalam fungsi. Hal serupa dapat diimpelementasikan dengan pointer.
a.    Pointer Sebagai Keluaran Fungsi
Suatu fungsi dapat dibuat agar keluarannya berupa pointer. Sebagai contoh, suatu fungsi menghasilkan  nilai balik berupa pointer yang merujuk ke string nama bulan.      
char *nama_bulan(int n)
{
static char bulan[13][17] =
{
"kode bulan salah",“januari",
"februari","maret","april",
"mei","juni","juli","agustus",
"september","oktober","november",
"desember"};
return ((n<1 || n>12) ?bulan[0] : bulan[n]);
}
Pada definisi fungsi diatas, char *nama_bulan(int n) menyatakan bahwa nilai balik fungsi nama_bulan() berupa pointer yang menunjuk ke data bertipe string yang berakhir dengan null. Pada fungsi nama_bulan(), mula-mula array bernama bulan dideklarasikan secara statis(supaya dideklarasikan sekali saja) dan sekaligus diberi nilai awal. Dibagian akhir fungsi, pernyataan :
return ((n<1 || n>12) ?bulan[0] : bulan[n]);
menyatakan bahwa nilai balik fungsi berupa pointer yang menunjuk ke :
·         String”kode bulan salah”(bulan [0]), jika argument fungsi bernilai kurang dari 1 atau lebih besar daripada 12;
·         Bulan[n], kalau n bernilai antara 1 sampai 12.
Input :
#include<iostream>
using namespace std;
char *nama_bulan(int n);
int main()
{
    int kode;
    cout<<" Bulan (1...12) = ";
    cin>>kode;
    cout<<" " <<nama_bulan(kode)
        <<endl;
    return 0;
}
char *nama_bulan(int n)
{
 static char bulan[13][17] =
{
"kode bulan salah","januari",     "februari", "maret","april","mei","juni",      "juli","agustus","september","oktober","november","desember"};
 return ((n<1 || n>12) ?bulan[0] : bulan[n]);
}
Output :
b.    String Sebagai Argumen
Argument berupa string biasa dinyatakan dengan pointer (pointer yang menunjuk ke tipe char) dan bukan menggunakan array karakter. Contoh :
Void strkiri(char hasil[], char st[],int n)
{
      Int I;
      For (i=0; i<n; i++)
            Hasil[i] = st [i];
      Hasil[i] = ‘\0’ ; //karakter null
}
Bagian seperti char hasil[] (argumen string) biasa dinyatakan dalam bentuk : char *hasil(pointer ke char)
Definisi fungsi berikut seperti diatas dapat ditulis menjadi :
Void strkiri(char hasil[], char st[],int n)
{
      Int I;
      For (i=0; i<n; i++)
            *(hasil+1) = *(st +1);
      *(hasil+1) = ‘\0’ ; //karakter null }
 

12.  POINTER KONSTAN

Pointer konstan berlaku seperti variabel konstan (konstanta bernama). Isinya tidak dapat diubah. Contoh : char bahasa[] = “C++”; char *const ptr = bahasa;
Pada contoh diatas, ptr berlaku sebagai pointer konstan yang menunjuk ke bahasa.
Input :
#include<iostream>
using namespace std;
int main()
{
    char bahasa[] = "C++";
    char pemrograman[] = "Pemrograman C++";

    char * ptr = bahasa;
    cout<<"ptr = " <<ptr<<endl;
    ptr = pemrograman ;
    cout<<"ptr = "<<ptr<<endl;

    return 0;
}
Output :


Tidak ada komentar:

Posting Komentar