Pointer pada Bahasa Pemrograman C / C++

https://im-informatika.blogspot.com/2015/03/pointer-pada-bahasa-pemrograman-c-c.html
Single Pointer
Pointer adalah variabel yang menunjuk variabel lain atau objek lain. Pada kenyataannya variabel pointer berisi alamat dari suatu objek lain atau variabel lain (yaitu objek yang dikatakan ditunjuk oleh pointer).
Contoh :
Manfaat Pointer :
- Pointer merupakan fitur yang dimiliki oleh bahasa c/c++ yang dapat memberikan keleluasaan mengakses dan memanage alamat memory dari objek yang lain.- Penggunaan Pointer juga dapat menghemat dalam penggunaan memori.
Deklarasi Pointer :
tipe *nama_variabel
nama_variabel adalah nama dari variabel pointer.
Contoh :
int *px; /* contoh 1 */ char *pch1, *pch2; /* contoh 2 */
Mengatur pointer menunjuk objek lain
Agar suatu pointer menunjuk ke variabel lain, mula – mula pointer harus diisi dengan alamat dari variabel yang akan ditunjuk. Untuk menyatakan alamat dari suatu variabel, operator & (operator alamat, bersifat unary) bisa dipergunakan, dengan menempatkannya didepan nama variabel. Sebagai contoh, bila x dideklarasikan sebagai variabel bertipe int, maka
&xberarti “alamat dari variabel x”. Adapaun contoh pemberian alamat x ke suatu variabel pointer px (yang dideklarasikan sebagai pointer yang menunjuk ke data bertipe int) yaitu :
px = &x;Pernyataan diatas berarti bahwa px diberi nilai berupa alamat dari variabel x. Setelah pernyataan tersebut dideklarasi barulah dapat dikatakan bahwa px menuju ke variabel x.
Mengakses isi dari objek yang ditunjuk pointer
Jika suatu variabel sudah ditunjuk oleh pointer, variabel yang ditunjuk oleh pointer tersebut dapat diakses melalui variabel itu sendiri (pengaksesan langsung) ataupun melalui pointer (pengaksesan tak langsung). Pengaksesan tak langsung dilakukan dengan menggunakan operator indirection (tak langsung) berupa simbol * (bersifat unary). contoh beberapa operator * yaitu :
*pxyang menyataka “isi atau nilai variabel/data yang ditunjuk oleh ppointer px”. Sebagai contoh jika y bertipe int, maka sesudah dua pernyataan berikut :
px = &x; y = *px;y akan berisi nilai yang sama dengan nilai x. Untuk lebih jelasnya perhatikan program ptr1.c
/* Program ptr1.c */ #include <stdio.h> main() { int y, x =87; /* x & y bertipe int */ int *px; /* var pointer yg menunjuk ke data yg bertipe int */ px = &x; /* px diisi dengan alamat dari variabel x */ y = *px; /* y diisi dengan nilai yg ditunjuk oleh px */ printf("Alamat x = %p \n", &x); printf("Isi px = %p \n", px); printf("Isi x = %d \n", x); printf("Nilai yang ditunjuk oleh px = %d \n", *px); printf("Nilai y = %d \n", y); }
Hasil dari program ptr1.c :
Pointer to Array
Hubungan antara pointer dan array pada C sangatlah erat. Sebab sesungguhnya array secara internal akan diterjemahkan dalam bentuk pointer. Pembahasan akan memberikan gambaran hubungan antara pointer dan array. Misalnya didalam suatu fungsistatic int tgl_lahir[3] = { 01, 09, 64 };
dan
int *ptgl;
Kemudian diberikan intruksi
ptgl = &tgl_lahir[0];
maka ptgl akan berisi alamat dari elemen array tgl_lahir yg berindeks nol. Intruksi diatas bisa juga ditulis menjadi
ptgl = tgl_lahir;
Sebab nama array tanpa tanda kurung menyatakan alamat aawal dari array. Sesudah penugasan diatas,
*ptgl
dengan sendirinya menyatakan elemen pertama (berindeks sama dengan nol) dari array tgl_lahir. Hal ini bisa dilihat melalui pembuktian program berikut.
#include <stdio.h> main() { static int tgl_lahir[] = {16, 4, 1974}; int *ptgl; ptgl = tgl_lahir; printf("Nilai yang ditunjuk oleh ptgl = %d\n", *ptgl); printf("Nilai dari tgl_lahir[0] = %d\n", tgl_lahir[0]); }
Hasil dar program diatas :
Pointer to String
#include <stdio.h> main() { /* pkota menunjuk konstanta string "SEMARANG" */ char *pkota = "SEMARANG"; printf("String yang ditunjuk oleh pkota = "); puts(pkota); // printf("%s\n", pkota); }
Hasil dari program diatas :
Pada program diatas,
char *pkota = "SEMARANG";
akan menyebabkan kompailer
- Mengalokasikan variabel pkota sebagai variabel pointer yang menunjuk ke obyek bertipe char dan menempatkan konstanta “SEMARANG” dalam suatu memori
- Kemudian pointer pkota akan menunjuk ke lokasi string “SEMARANG”
Array of Pointer
Suatu array bisa digunakan untuk menyimpan sejumlah pointer. Sebagai contoh :char *namahari[10];
Merupakan pernyataan untuk mendeklarasikan array pointer. Array namahari terdiri dari 10 elemen berupa pointer yang menunjuk ke data bertipe char.
Array pointer bisa diinisialisasi sewaktu pendeklarasian. Sebagai contoh :
static char *namahari[] = {"Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"};
Pada contoh ini,
namahari[0] berisi alamat yang menunjuk ke string “Senin”.
namahari[1] berisi alamat yang menunjuk ke string “Selasa”.
namahari[2] berisi alamat yang menunjuk ke string “Rabu”.
dan sebagainya
Pointer to Pointer
Suatu pointer bisa saja menunjuk ke pointer lain.Gambar berikut memberikan contoh mengenai pointer menunjuk pointer.
Untuk membentuk rantai pointer seperti pada gambar diatas, pendeklarasian yang diperlukan berupa :
int var_x; int *ptr1; int **ptr2;
Perhatikan pada deklarasi didepan:
- var_x adalah variabel bertipe int.
- ptr1 adalah variabel pointer yang menunjuk kedata bertipe int.
- ptr2 adalah variabel pointer yang menunjuk kepointer int. (itulah sebabnya deklarasinya berupa int **ptr2; )
- Agar ptr1 menunjuk ke variabel var_x, perintah yang yang diperlukan berupa :
ptr1 = &var_x;
- Sedangkan, supaya ptr2 menunjuk ke ptr1, instruksi yang diperlukan adalah :
ptr2 = &ptr1;
- Contoh berikut memberikan gamabaran cara pengaksesan nilai pada var_x melalui pointer ptr2 dan ptr1.
#include <stdio.h> main() { int var_x = 273; int *ptr1; int **ptr2; ptr1 = &var_x; ptr2 = &ptr1; printf("Nilai var_x = %d\n", *ptr1); printf("Nilai var_x = %d\n", **ptr2); }
Hasil program diatas :
Pointer dalam Fungsi
Penerapan pointer sebagai parameter yaitu jika diinginkan agar nilai suatu variabel internal dapat diubah oleh fungsi yang dipanggil. Sebagai contoh dapat dilihat pada fungsi berikut.void naikkan_nilai(int *x, int *y) { *x = *x + 2; *y = *y + 2; }
Fungsi diatas dimaksudkan agar kalau dipanggil, variabel yang berkenan dengan parameter aktual dapat diubah nilainya, masing – masing diinaikan sebesar 2. Contoh pemanggilan :
naikkan_nilai(&a, &b);
Perhatikan, dalam hal ini variabel a dan b harus ditulis diawal operator alamat (&) yang berarti menyatakan alamat variabel, sebab parameter fungsi dalam pendefinisian berupa pointer.
Contoh program :
#innclude <stdio.h> void naikkan_nilai(int *, int *); main() { int a = 3, b = 7; printf("SEMULA : a = %d b = %d\n", a, b); naikkan_nilai(&aa, &b); printf("KINI : a = %d b = %d\n", a, b); } void naikkan_nilai(int *x, int *y) { *x = *x + 2; *y = *y + 2; }
Hasil dari program diatas :
Pointer sebagai keluaran fungsi
Suatu fungsi dapat dibuat agar keluarannya berupa pointer. Misalnya, suatu fungsi menghasilkan keluaran berupa pointer yang menunjuk ke string nama_bulan, seperti pada contoh berikut.char *nama_bulan(int n) { static char *bulan[]= {"Kode bulan salah", "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "Nopember", "Desember" }; return ( (n<1 || n>12) ? bulan[0] : bulan[n] ) ; }
Pada definisi fungsi di atas,
char *nama_bulan()menyatakan bahwa keluaran fungsi nama_bulan() berupa pointer yang menunjuk ke objek char ( atau string).
Dalam fungsi nama_bulan(), mula – mula array bernama bulan dideklarasikan dan sekaligus diinisialisai agar menunjuk sejumlah string yang menyatakan nama bulan.
Dibagian kiri fungsi, pernyataan
return ( (n<1 || n>12) ? bulan[0] : bulan[n] ) ;
menyatakan bahwa hasil fungsi berupa pointer yang menunjuk ke
» string “Kode bulan salah” (bulan[0]) jika masukan fungsi n<1 atau n>12
» bulan[n] untuk n yang terletak antara 1 sampai dengan 12