BAB VIII Pointer
BAB VIII Pointer
POINTER
Tujuan :
1. Menjelaskan tentang konsep dari variabel pointer
2. Menjelaskan tentang pointer array
3. Menjelaskan tentang pointer string
4. Menjelaskan tentang array pointer
5. Menjelaskan tentang pointer dalam fungsi
6. Menjelaskan tentang pointer sebagai parameter fungsi
7. Menjelaskan tentang pointer yang menunjuk pointer.
px
zzzz 1000
Address
1000 ?
x
Contoh pertama menyatakan bahwa px adalah variabel pointer yang menunjuk ke suatu
data bertipe int, sedangkan contoh kedua masing pch1 dan pch2 adalah variabel pointer
yang menunjuk ke data bertipe char.
menyatakan variabel
pointer
nama variabel
pointer tipe data yang ditunjuk
oleh variabel pointer
&x
berarti “alamat dari variabel x”. Adapun contoh pemberian alamat x ke suatu variabel
pointer px (yang dideklarasikan sebagai pointer yang menunjuk ke data bertipe int) yaitu :
13
px = &x;
Pernyataan di atas berarti bahwa px diberi nilai berupa alamat dari variabel x. Setelah
pernyataan tersebut dieksekusi barulah dapat dikatakan bahwa px menunjuk ke variabel x.
*px
yang menyatakan “isi atau nilai variabel/data yang ditunjuk oleh pointer 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 contoh
program ptr1.c
/* Program : ptr1.c */
#include <stdio.h>
main()
{
int y, x = 87; /* x & y bertipe int */
int *px;
/* var pointer yang menunjuk ke data yang bertipe int */
Contoh eksekusi :
Alamat x = 0012FF78
Isi px = 0012FF78
Isi x = 87
Nilai yang ditunjuk oleh px = 87
Nilai y = 87
px = &x;
y = *px;
y = x;
maka y tidaklah berisi nilai x, sebab px belum diatur agar menunjuk ke variabel x. Hal
seperti ini harap diperhatikan. Kalau program melibatkan pointer, dan pointer belum
diinisialisasi, ada kemungkinan akan terjadi masalah yang dinamakan “bug” yang bisa
mengakibatkan komputer tidak dapat dikendalikan (hang).
Selain itu tipe variabel pointer dan tipe data yang ditunjuk harus sejenis. Bila tidak
sejenis maka akan terjadi hasil yang tidak diinginkan. Lebih jelasnya perhatikan contoh
program ptr2.c.
/* Program : ptr2.c */
13
#include <stdio.h>
main()
{
int *pu;
int nu;
int u = 1234;
pu = &u;
nu = *pu;
pu = &u;
maka pu akan menunjuk data berukuran 4 byte (tipe float) sekalipun u berukuran 2 byte
(tipe int). Oleh karena itu, pernyataan
nu = *pu;
tidak akan membuat nu berisi nilai u. untuk lebih jelasnya lihat gambar berikut.
double *pu;
float nu;
int u; data yang
-------- u ditunjuk oleh pu
pu = &u; bukan bagian dari
u
Gambar 8.3 Ilustrasi kesalahan yang terjadi karena tipe tidak sejenis
13
d = 54.5;
pd = &d;
merupakan instruksi untuk mengubah nilai variabel d secara tak langsung. Perintah di atas
berarti “jumlahkan yang ditunjuk pd dengan 10 kemudian berikan ke yang ditunjuk oleh
pd”, atau identik dengan pernyataan
d = d + 10;
pd = &d;
maka pernyataan
d = d + 10;
13
/* Program : ptr3.c */
#include <stdio.h>
main()
{
float d = 54.5f, *pd;
pd = &d;
*pd += 10;
Contoh eksekusi :
dan
int *ptgl;
maka ptgl akan berisi alamat dari elemen array tgl_lahir yang berindeks nol. Instruksi di
atas bisa juga ditulis menjadi
ptgl = tgl_lahir;
13
sebab nama array tanpa tanda kurung menyatakan alamat awal dari array. Sesudah
penugasan seperti di atas,
*ptgl
dengan sendirinya menyatakan elemen pertama (berindeks sama dengan nol) dari array
tgl_lahir. Hal ini bisa dilihat melalui pembuktian program berikut.
/* Program : ptr4.c */
#include <stdio.h>
main()
{
static int tgl_lahir[] = {16, 4, 1974};
int *ptgl;
ptgl = tgl_lahir;
Contoh eksekusi :
/* Program : ptr5.c */
#include <stdio.h>
main()
{
static int tgl_lahir[] = {16, 4, 1974};
int *ptgl, i;
ptgl = tgl_lahir;
Contoh eksekusi:
/* Program : ptr6.c */
#include <stdio.h>
main()
{
static int tgl_lahir[] = {16, 4, 1974};
int i;
int *ptgl;
ptgl = tgl_lahir;
/* Program : ptr4.c */
#include <stdio.h>
main()
{
/* pkota menunjuk konstanta string “SEMARANG” */
char *pkota = “SEMARANG”;
Contoh eksekusi :
S E M A R A N G \0
Gambar 8.4 Pointer menunjuk data
tetapi sebenarnya kedua pernyataan inisialisasi di depan tidaklah tepat sama. Sebab pkota
adalah pointer (menyatakan alamat) yang dengan mudah dapat diatur agar menunjuk ke
string lain (bukan string “SEMARANG”), sedangkan kota adalah array (array
menyatakan alamat yang konstan, tak dapat diubah). Perhatikan dua program di bawah ini
/* Program : arrnama.c
Menukarkan isi 2 string tanpa pemakaian pointer */
#include <stdio.h>
#include <string.h>
#define PANJANG 20
main()
{
char namax[PANJANG];
13
puts("SEMULA : ");
printf("nama1 --> %s\n", nama1);
printf("nama2 --> %s\n", nama2);
strcpy(namax, nama1);
strcpy(nama1, nama2);
strcpy(nama2, namax);
puts("KINI : ");
printf("nama1 --> %s\n", nama1);
printf("nama2 --> %s\n", nama2);
}
/* Program : ptrnama.c
Menukarkan isi 2 string dengan fasilitas pointer */
#include <stdio.h>
#include <string.h>
main()
{
char *namax;
puts("SEMULA : ");
printf("nama1 --> %s\n", nama1);
/* nama1:pointer yg menunjuk ke string JAMES BOND */
printf("nama2 --> %s\n", nama2);
/* nama2:pointer yg menunjuk ke string HERCULE POIROT */
namax = nama1;
nama1 = nama2;
nama2 = namax;
puts("KINI : ");
printf("nama1 --> %s\n", nama1);
printf("nama2 --> %s\n", nama2);
}
13
xxx ?
?
?
?
?
namahari
Gambar 8.5 Array pointer
▪ Array pointer bisa diinisialisasi sewaktu pendeklarasian. Sebagai contoh:
▪ Untuk membentuk rantai pointer seperti pada gambar di atas, pendeklarasian yang
diperlukan berupa
int var_x;
int *ptr1;
int **ptr2;
ptr1 = &var_x;
ptr2 = &ptr1;
▪ Contoh berikut memberikan gambaran 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;
Contoh eksekusi :
Nilai var_x = 273
14
▪ Fungsi di atas dimaksudkan agar kalau dipanggil, variabel yang berkenaan dengan
parameter aktual dapat diubah nilainya, masing-masing dinaikkan sebesar 2. Contoh
pemanggilan :
naikkan_nilai(&a, &b);
▪ Perhatikan, dalam hal ini variabel a dan b harus ditulis diawali operator alamat (&)
yang berarti menyatakan alamat variabel, sebab parameter fungsi dalam pendefinisian
berupa pointer.
14
/* Program : argptr.c
Fungsi dengan argumen berupa pointer */
#include <stdio.h>
main()
{
int a = 3, b = 7;
naikkan_nilai(&a, &b);
printf("KINI : a = %d b = %d\n", a, b);
}
Contoh eksekusi :
Semula : a = 3 b = 7
Kini : a = 5 b = 9
14
char *nama_bulan()
#include <stdio.h>
main()
{
int bl;
char *pch;
char *nama_bulan(int n)
{
static char *bulan[] = {
"Kode bulan salah",
"Januari",
"Februari",
"Maret",
"April",
"Mei",
"Juni",
"Juli",
"Agustus",
"September",
"Oktober",
"November",
"Desember"
};
Kesimpulan
• Tipe variabel pointer adalah tipe variabel yang berisi alamat dari variabel yang
sebenarnya.
14
• Tipe variabel pointer harus sama dengan tipe varibel yang ditunjuk.
• Hubungan antara pointer dan array pada C sangatlah erat, sebab sesungguhnya array
secara internal akan diterjemahkan dalam bentuk pointer
• Varibel pointer bisa berupa string, array atau tipe variabel yang lainnya.
• Suatu pointer bisa saja menunjuk ke pointer lain (pointer to pointer)
• Variabel pointer bisa digunakan sebagai parameter dalam sebuah fungsi,
sebagaimana juga bisa dijadikan sebagai nilai balik (return value) dari sebuah
fungsi.
Latihan :
Buatlah potongan program untuk soal-soal di bawah ini
#include <stdio.h>
main()
{
int z = 20, s = 30;
int *pz, *ps;
pz = &z;
ps = &s;
*pz += *ps;
#include <stdio.h>
main()
{
char c = 'Q';
char *char_pointer = &c;