Anda di halaman 1dari 36

POINTER

A. PENGERTIAN POINTER
1. Definisi Pointer

Suatu pointer (variable penunjuk) adalah suatu variable yang berisi dengan
alamat lokasi, yaitu suatu memori tertentu. Bahasa C menyediakan 2 buah
operator untuk operasi pointer yaitu operator ‘*’ dan operator ‘&’.

Variabel pointer sering dikatakan sebagai variabel yang menunjuk ke


obyek lain. Pada kenyataan yang sebenarnya, variabel pointer berisi alamat dari
suatu obyek lain (yaitu obyek yang dikatakan ditunjuk oleh pointer). Sebagai
contoh, px adalah variabel pointer dan x adalah variabel yang ditunjuk oleh px.
Kalau x berada pada alamat memori (alamat awal) 1000, maka px akan berisi
1000. Sebagaimana diilustrasikan pada gambar di bawah ini:

Pointer adalah sebuah variabel yang berisikan alamat memori (bukan nilai)
atau dengan kata lain dapat dikatakan bahwa pointer adalah suatu variabel
penunjuk ke lamat memori tertentu. Yang disimpan oleh variabel yang
didefinisikan sebagai pointer adalah ‘alamat’ variabel tersebut.

Seperti yang kita ketahui, variabel pointer berfungsi sebagai penunjuk


alamat lokasi variabel lain, dan mengganti nilai variable lyang ditunjuk tersebut

1
Pada operasi pointer, kita menggunakan 2 buah operator dalam bahasa C yaitu “*”
dan “&”. Dalam pembuatan program menggunakan pointer, tanda asterisk “*”
digunakan untuk menentukan variable yang menjadi suatu pointer.

Pada deklarasi, penulisan awal deklarasi dapat dibuat sebagai berikut :

Tipe_data *nama_pointer; atau Tipe_data* nama_pointer;

Keterangan:

Tipe_data dapat berupa sembarang tipe seperti halnya pendefinisian


variabel.

Nama_pointer adalah nama variabel pointer yang akan digunakan.

* adalah operator memori untuk mengembalikan nilai variabel pada


alamatnya yang ditentukan oleh operand.

Contoh:

int *pint; atau int* pint;

char *pchr; atau char* pchr;

Setiap variabel yang kita buat pada program akan memiliki alamat
memori.Alamat memori berfungsi untuk menentukan lokasi penyimpanan data
pada memori (RAM). Kadang alamat memori ini disebut reference atau referensi.
Coba perhatikan gambar ini:

2
Pada gambar ini, kita membuat dua variabel.. yakni umur dan tinggi. Kedua
variabel ini punya alamat memori masing-masing.Variabel umur alamat
memorinya adalah 0001, sedangkan tinggi alamat memorinya 0002. Begitu
seterusnya.. Pokoknya, setiap kita membuat variabel pasti akan punya alamat
memori. untuk melihat alamat memori yang digunakan pada variabel, kita bisa
pakai simbol & (emphasis).

Alamat memori ini merupakan alamat memori dari variabel umur. Lalu, si
pointer p_tinggi menggunakan alamat memori dari variabel tinggi.Dengan
begini..Pointer akan bisa mengakses data yang tersimpan di dalam alamat memori
tersebut. Biar lebih jelas, mari coba dalam program. Buatlah program baru dengan
nama contoh_pointer.c, kemudian isi dengan kode berikut:
#include <stdio.h>
void main(){
// membuat variabel
int umur = 19;
float tinggi = 175.6;
// membuat pointer
int *pointer_umur = &umur;
int *pointer2 = &umur;
float *p_tinggi = &tinggi;
// mecetak alamat memori variabel
printf("alamat memori variabel 'umur' = %d\n", &umur);
printf("alamat memori variabel 'tinggi' = %d\n", &tinggi);
// mencetak referensi alamat memori pointer
printf("referensi alamat memori *pointer_umur = %d\n",
pointer_umur);
printf("referensi alamat memori *pointer2 = %d\n", pointer2);
printf("referensi alamat memori *p_tinggi = %d\n", p_tinggi);
}

3
Setelah itu, coba compile dan jalankan.

Hasil outputnya:

Alamat memori yang digunakan sebagai referensi pada pointer akan sama
dengan alamat memori dari variabel yang kita pakai sebagai referensi.

Apa itu Pointer dalam Bahasa C. Pointer (dalam pemrograman C) adalah


suatu variable yang berisikan suatu alamat lokasi tertentu. Yang disimpan oleh
variabel yang didefinisikan sebagai pointer adalah ‘alamat’ variabel tersebut.

Seperti yang kita ketahui, variabel pointer berfungsi sebagai penunjuk


alamat lokasi variabel lain, dan mengganti nilai variable lyang ditunjuk tersebut
Pada operasi pointer, kita menggunakan 2 buah operator dalam bahasa C yaitu “*”
dan “&”.

Dalam pembuatan program menggunakan pointer, tanda asterisk “*”


digunakan untuk menentukan variable yang menjadi suatu pointer.

Pada deklarasi, penulisan awal deklarasi dapat dibuat sebagai berikut :

Tipe_data *nama_variabel_komputer

Seperti contoh, kita membuat deklarasi int *b, berarti sebuah pointer hanya
dapat menunjuk sebuah variable dengan tipe data integer Untuk mendapatkan
alamat dari suatu variabel, maka kita perlu menggunakan operator “&” di depan
variable tersebut. Adapun contoh dalam penggunaannya :

4
printf(“Alamat dari variabel a = %d”, &a);

Maka pada saat program dijalankan, akan muncul alamat dari variabel a
tersebut Untuk mendapatkan nilai dari suatu variable, maka pertintah yang
digunakan cukup hanya dengan memanggil variabel nya saja. Adapun contoh
penggunaannya :

Printf(“Isi dari variabel a = %d”, a);

Maka pada saat program dijalankan, akan muncul nilai dari variabel a
tersebut Untuk mendapatkan nilai dari suatu alamat yang terdapat pada isi pointer,

Maka perintah yang digunakan adalah mendambah tanda asterisk “*” di


depan variabel. Adapun contoh penggunaannya :

*b=&a

Printf(“Isi dari variabel yang ditunjuk poiter adalah %d”, *b);

Maka pada saat program dijalankan, akan muncul nilai dari variabel yang
ditunjuk poleh pointer b, yaitu nilai dari variabel a tersebut pemrograman C)
adalah suatu variable yang berisikan suatu alamat lokasi tertentu. Untuk contoh
program yang mencari alamat dan nilai variabel, dapat kita lihat contoh koding
tersebut :
#include <stdio.h>

main(){

int *b;

int a;

a = 9;

printf("isi variabel a = %d\n”, a);

printf("alamat variabel a = %d\n”, a);

5
printf("alamat variabel *b = %d\n”, &b);

printf("isi variabel *b = %d\n”, b);

b = &a;

printf("alamat variabel *b = %d\n”, &b);

printf("isi variabel *b = %d\n”, b);

printf(“Isi dari alamat %d = %d”,b,*b);

Pada operasi pointer, kita menggunakan 2 buah operator dalam bahasa C


yaitu “*” dan “&”. Dalam pembuatan program menggunakan pointer, tanda
asterisk “*” digunakan untuk menentukan variable yang menjadi suatu pointer.

Operator alamat (Address operator (&))

Pada pendeklarasian variable, user tidak diharuskan menentukan lokasi


sesungguhnya pada memory. Hal ini akan dilakukan secara otomatis oleh
compiler dan operating system pada saat run-time. Jika ingin mengetahui di
mana suatu variable disimpan, dapat dilakukan dengan memberikan tanda
ampersand (&) di depan variable, yang berarti “address off”.

Contoh:

Buku = &bahasa;

Akan memberikan variabel buku alamat dari bahasa, karena variable


bahasa diberi awalan ampersand (&), maka menjadi pokok disini adalah alamat
dalam memory, bukan isi variable. Misalkan bahasa diletakkan di alamat 1776
kemudian dituliskan instruksi sbb:

6
Bahasa = 25; Sejarah = bahasa; buku = &bahasa;

Maka hasilnya

Operator Reference (*)

Dengan menggunakan pointer kita dapat mengakses nilai yang tersimpan secara
langsung dengan memberikan awalan operator asterisk(*) pada identifier pointer,
yang berarti “value pointed by”.

Contoh:

BhsC = *buku

(dapat dikatakan bahwa BhsC sama dengan nilai yang ditunjuk oleh buku).
BhsC = 25, karena buku di alamat 1776, dan nilai yang berda pada lamat 1776
adalah 25.

2. Mengisi dan Mengakses Nilai Variabel Pointer

Suatu variabel pointer dapat menunjuk ke variabel lain. Contohnya adalah:

7
Hasil dari program di atas adalah :

Dari hasil tersebut membuktikan bahwa suatu variabel pointer dapat


menunjukalamat dari suatu variabel. Selain itu, variabel pointer juga dapat untuk
mengakses isi dari suatu variabel. Berikut contohnya:

8
B. OPERATOR PADA POINTER

Dari kedua contoh tersebut terdapat kesimpulan bahwa operator pointer ada
dua, yaitu:

a. Operator & (Operator Diference)

Operator deference (&) yaitu mendeklarasikan suatu variabel didalam


penggantian memori. Operator ini biasa disebut dengan “address of”.

b. Operator * (Operator Reference)

Operator Reference (*) yaitu dapat mengakses secara langsung nilai yang
terdapat didalam variabel yang berpointer, hal ini dapat dilakukan dengan
menambahkan identifier asterisk (*). Operator ini biasa disebut dengan “value
pointed by”.

C. OPERASI PADA POINTER

Variabel pointer dapat dioprasikan.oprasi pada pointer diantaranya adalah


operasi assignment, operasi aritmatika dan operasi logika.

a. Operasi Assignment / Penugasan

9
Suatu variabel pointer seperti halnya variabel lain, juga bisa mengalami
operasi penugasan. Nilai dari suatu variabel pointer dapat disalin ke variabel
pointer yang lain

Contoh Program Operasi Assignment 1 :

#include
void main()
{
floaty,*x,*z;
y=12.34;
x=&y;
z=x;//assignment antar variabel pointer
//berapakah nilai x?
//berapakah niali y?
}

Contoh Program Operasi Assignment 2 :

#include
#include
void main()
{ int nilai[3], *penunjuk;
clrscr();
nilai[0] = 125;
nilai[1] = 345;
nilai[2] = 750;
penunjuk = &nilai[0];
cout<<"Nilai "<<*penunjuk <<" ada di alamat memori
"< cout<<"Nilai "<<*(penunjuk+1) <<" ada di alamat
memori "< cout<<"Nilai "<<*(penunjuk+2) <<" ada di

10
alamat memori "< getch();
}

b. Operasi Aritmatika

Variabel pointer dapat ditambah atau dikurangi dengan nilai integer.


Operasi penambahan dengan suatu nilai integer merupakan suatu peningkatan
nilai pointer yang menunjukkan lokasi data berikutnya di memori. Misalnya
pointer X menyimpan alamat 1000, maka :

 Jika x adalah int, maka p++ akan menunjuk alamat 1002 (karena int
berukuran 2 byte)
 Jika X adalah char, maka p++ akan menunjuk alamat 1001 (karena ukuran
char adalah 1 byte)

Contoh Program Operasi Aritmatika 1 :

#include
void main()
{
int a[4]={10,20,30,40};
int *pa;
pa = a;
printf("pa = %d\n",pa);
printf("pa++ = %d\n",++pa);
}

Contoh Program Operasi Arimatika 2 :

#include
#include

11
void main()
{
int nilai[3], *penunjuk;
clrscr();
nilai[0] = 125;
nilai[1] = 345;
nilai[2] = 750;
penunjuk = &nilai[0];
cout<<"Nilai "<<*penunjuk <<" ada di alamat memori
"< cout<<"Nilai "<<*(penunjuk+1) <<" ada di alamat
memori "< cout<<"Nilai "<<*(penunjuk+2) <<" ada di
alamat memori "< getch();
}

c. Operasi Logika

Dua variabel pointer dapat dibandingkan jika keduanya mempunyai type


yang sama.

D. CONTOH APLIKASI POINTER

Salah satu penggunaan pointer adalah untuk membuat suatu array yang
dinamis (banyaknya data yang bisa ditampung sesuai keperluan). Sebagaimana
kita ketahui jika kita membuat suatu program yang dapat menampung data nilai
sebanyak 5 buah maka kita akan membuat suatu variabel array yang bertipe int
dengan perintah int data[5]. Dengan cara begitu maka program hanya akan
berjalan dengan baik jika data yang diinputkan banyaknya di kurang atau sama
dengan 5 buah. Apa yang terjadi ketika data yang akan diinputkan ternyata 10
buah, maka langkah yang dilakukan adalah harus mengubah programnya dan
mengganti int data[5] menjadi int data[10].

12
Cara lain untuk membuat program tersebut adalah dengan menggunakan
suatu variabel array yang dinamis dimana pemesanan tempat yang diperlukan
untuk menyimpan data tidak dideklarasikan dalam program tapi dilakukan secara
runtime (ketika program berjalan).

E. BAHAYA POINTER

Bahaya yang mungkin ada dengan pointer sebagai moniker: memory leak,
double delete, invalid memory access. Semuanya dapat dihindari dengan
ownership analysis yang bagus (pada setiap saat, harus diketahui pihak mana yang
bertanggung jawab mendelete sebuah object). Jika hal ini sulit dilakukan,
misalnya karena shared ownership, anda dapat menggunakan smart pointer atau
garbage collector.

Bahaya yang mungkin ada dengan pointer sebagai iterator: array out of
bound. Salah satu carayang efektif menghindari hal ini adalah dengan
menggunakan standard algorithm.

Bahaya yang mungkin ada dengan pointer sebagai abstraksi fixed


memory : Tidak tahu, tetapi ini bukan mainan sembarang programmer.

F. INISIALISASI PADA POINTER


Pemberian harga awal pada variable-variabel pointer dapat sekaligus
dilakukan pada saat variable-variabel tersebut dideklarasikan. Harga awal yang
diberikan adalah alamat lokasi memory.

Contoh :
int i,j; int *intptr = &i; atau bisa juga
int i,j, *intptr ; intptr = &i ;

input variable pointer ke jenis data integer dengan memberi harga awal berupa

13
alamat variable i.

Contoh :
#include<stdio.h>

void main()
{

int i,j, *intptr; i = 890;

ptintf(“variable i terletak pd alamat memory %p.\


n”,&i); printf(“alamat i = %p,menerima nilai %d\n”,&i,
i); intptr = &i; // intptr menunjuk alamat variable
i

printf(‘alamat intptr = %p, menunjuk ke nilai %d\


n”,intptr,*intptr); j = *intptr; printf(“alamat j =
%p,menerima nilai %d\n”,&j, j);

output : variable i terletak pd alamat memory 255F:2272. alamat i = 255F:2272.,


menerima nilai 890
alamat intptr = 255F:2272., menunjuk ke nilai 890. alamat j = 255F:2272,
menerima nilai 890

G. MENGATUR POINTER AGAR MENUNJUK KE VARIABEL 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

14
dipergunakan, dengan menempatkannya di depan nama variabel. Sebagai contoh,
bila x dideklarasikan sebagai variabel bertipe int,

Maka :
&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 : 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.

H. MENGAKSES ISI SUATU VARIABEL MELALUI 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 penerapan operator * yaitu :


*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()


{

15
int y, x = 87; /* x & y bertipe int */ int *px;
/* var pointer yang menunjuk ke data

yang 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);
}

I. MENGAKSES DAN MENGUBAH ISI SUATU VARIABEL


POINTER

Contoh berikut memberikan gambaran tentang pengubahan isi suatu


variabel secara tak langsung (yaitu melalui pointer). Mula-mula p dan d
dideklarasikan sebagai pointer yang menunjuk ke suatu data bertipe float dan d
sebagai variabel bertipe float.

Selanjutnya d = 54.5; digunakan untuk mengisikan nilai 54,5 secara


langsung ke variabel d. Adapun pd = &d; digunakan untuk memberikan alamat
dari d ke pd. Dengan demikian pd menunjuk ke variabel d.

Sedangkan pernyataan berikutnya *pd = *pd + 10; (atau: *pd += 10; )


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;
Akan tetapi, seandainya tidak ada instruksi pd = &d;
maka pernyataan

*pd = *pd + 10; tidaklah sama dengan d = d + 10;


134

16
/* Program : ptr3.c */

#include <stdio.h> main()

{
float d = 54.5f, *pd;

printf("Isi d mula-mula = %g\n", d); pd = &d;


*pd += 10;

printf("Isi d sekarang = %g\n", d);

Contoh eksekusi :

Isi d mula-mula = 54.5 Isi d sekarang = 64.5\

J. POINTER VOID

Pointer void adalah pointer yang dapat menunjuk ke sembarang tipe data. Jadi
satu pointer dapat menunjuk ke tipe data integer, tipe data float, dan lain
sebagainya.

Berikut ini contoh dari pointer void:

17
K. POINTER DAN ARRAY

Hubungan antara pointer dan array pada C sangatlah erat. Sebab


sesungguhnya array secara internal akan diterjemahkan dalam bentuk pointer.
Pembahasan berikut akan memberikan gambaran hubungan antara pointer dan
array. Misalnya dideklarasikan di dalam suatu fungsi.

static int tgl_lahir[3] = { 01, 09, 64 };

dan
int *ptgl;

Kemudian diberikan instruksi

ptgl = &tgl_lahir[0]; //pointer to array of integer

maka ptgl akan berisi alamat dari elemen array tgl_lahir yang berindeks nol.
Instruksi di atas bisa juga ditulis menjadi ptgl = tgl_lahir;
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.

18
/* Program : ptr4.c */

#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]);

Contoh eksekusi :

Nilai yang ditunjuk oleh ptgl = 16 Nilai dari tgl_lahir[0] = 16

L. POINTER DAN STRING

Contoh hubungan pointer dan string ditunjukkan pada program berikut.

/* Program : ptr4.c */

#include <stdio.h>

main()
{

/* pkota menunjuk konstanta string “SEMARANG” */ char

19
*pkota = “SEMARANG”;
printf(“String yang ditunjuk oleh pkota = ”);
puts(pkota);
// printf(“%s\n”, pkota);
}

Contoh eksekusi :

String yang ditunjuk oleh pkota = SEMARANG

Pada program di atas,

char *pkota = “SEMARANG”; akan menyebabkan kompiler

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”.

Pernyataan di atas menyerupai pernyataan:

char kota[] = “SEMARANG”;

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).

20
M. ARRAY DARI 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.

N. POINTER MENUJU POINTER

Suatu pointer bisa saja menunjuk ke pointer lain. Gambar berikut memberikan
contoh mengenai pointer menunjuk pointer.

21
Untuk membentuk rantai pointer seperti pada gambar di atas,
pendeklarasian yang diperlukan berupa

 int var_x;
 int *ptr1;
 int **ptr2;

Perhatikan pada deklarasi di depan:


 var_x adalah variabel bertipe int
 ptr1 adalah variabel pointer yang menunjuk ke data bertipe int.
 ptr2 adalah variabel pointer yang menunjuk ke pointer int.
(itulah sebabnya deklarasinya berupa int **ptr2; )

Agar ptr1 menunjuk ke variabel var_x, perintah yang diperlukan berupa

ptr1 = &var_x;. Sedangkan supaya ptr2 menunjuk ke ptr1, instruksi yang

diperlukan adalah ptr2 = &ptr1;

Contoh berikut memberikan gambaran cara pengaksesan nilai pada var_x


melalui pointer ptr2 dan ptr1.

/* File program : ppointer.c

Contoh program untuk pointer yang menunjuk pointer */

#include <stdio.h>

main()

int var x = 273; int *ptr1;

int **ptr2; ptr1 = &var_x; ptr2 = &ptr1;

22
printf("Nilai var_x = %d\n", *ptr1);

printf("Nilai var_x = %d\n", **ptr2);

Contoh eksekusi :

Nilai var_x = 273 Nilai var_x = 273

- Pointer dalam fungsi


Pointer dan kaitannya dengan fungsi yang akan dibahas berikut meliputi :

 Pointer sebagai parameter fungsi


 Pointer sebagai keluaran fungsi

O. POINTER SEBAGAI PARAMETER 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;
}

23
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.

/* Program : argptr.c
Fungsi dengan argument beberapa pointer :

#include <stdio.h>

void naikkan_nilai(int *, int *);

main()

int a = 3, b = 7;

printf("SEMULA : a = %d b = %d\n", a, b);

naikkan_nilai(&a, &b);

printf("KINI : a = %d b = %d\n", a, b);

void naikkan_nilai(int *x, int *y)

*x = *x + 2;

*y = *y + 2;

24
}

P. 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 obyek char (atau
string).

25
Dalam fungsi nama_bulan(), mula-mula array bernama bulan
dideklarasikan dan sekaligus diinisialisasi agar menunjuk sejumlah string yang
menyatakan nama bulan.

Di bagian akhir 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.

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 obyek char (atau
string).

26
Dalam fungsi nama_bulan(), mula-mula array bernama bulan
dideklarasikan dan sekaligus diinisialisasi agar menunjuk sejumlah string yang
menyatakan nama bulan.

Di bagian akhir 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.

/* File program : pbulan.c


Fungsi dengan keluaran berupa pointer yang menujuk string */

#include <stdio.h>

char *nama_bulan(int
n); //prototype
function main()

int bl; char *pch;

printf("Masukkan Bulan 1..12 : ");

scanf("%d", &bl);

pch = nama_bulan(bl);

printf("Bulan ke-%d adalah %s\n", bl, nama_bulan(bl));

char *nama_bulan(int n)

27
static char *bulan[] = { "Kode bulan salah",

"Januari
",

“Februari”,

“Maret”,

"April",

"Mei",

“Juni”,

“Juli”,

“Agustus”,

“September”,

“Oktober”,

“November”,

“Desember”

};

return ((n<1||n>12) ? bulan[0] : bulan[n]);

Q. POINTER DALAM PASCAL

Variabel bertipe pointer adalah variabel yang nilainya merupakan alamat


memori,yaitu alamat memori dari sebuah nilai dengan jenis/tipe data tertentu. Di
bawah inidisajikan contoh pendeklarasian beberapa variabel bertipe pointer :

28
 

var alamatNilaiInteger:^integer;

var alamatNilaiReal:^real;

var alamatNilaiString:^string;

type TString20=string[20];

var alamatString20:^TString20;

type TArrayInt=array[1..10] of integer;

var alamatArrayInt:^TArrayInt;

type TDataMhs=recordNIM:array[1..10] of '0'..'9';

Nama:string[40];IPK:real;

end;

var alamatDataMhs:^TDataMhs;

Dalam contoh di atas, alamatNilaiInteger, alamatNilaiReal, alamatNilaiStri
ng,alamatTString20, alamatArrayInt dan alamatDataMhs, merupakan variabel bert
ipe pointer, karena dideklarasikan menggunakan tanda ^ (caret , tanda sisipan).
Dengan demikian, bisa disimpulkan bahwa untuk mendeklarasikan variabel
bertipe pointer, bentuk umumnya adalah:

var namaVariabelPointer:^tipeDataNilaiYangDitunjukPointer.

Terdapat 4 cara untuk mengisi nilai variabel pointer:

 Menggunakan Operator @ (address-of)


 Mengunakan Variabel Pointer Yang Lain
 Menggunakan Prosedur New

29
 Menggunakan Keyword

NIL.Sedangkan untuk mengambil atau mengganti isi memori yang


ditunjuk oleh sebuahvariabel pointer, bentuknya adalah

namaVariabelPointer^

(nama variabel pointer diikuti dengan tanda sisipan).

R. POINTER DAN VARIABEL TERSTRUKTUR

Untuk mendeklarasikan variabel pointer bertipe
struct  bentuknya adalah sebagaiberikut:

struct {/* definisi struktur */} *p_struktur;

Sebagaimana pointer yang menunjuki variabel bertipe sederhana,  pointer
yang menunjukkan variabel bertipe terstruktur akan menyebabkan alamat memori 
yang ditunjuk akan maju atau mundur sejumlah byte yang dipergunakan oleh tipe
terstruktur tersebut. Sedangkan untuk menunjuk masing masing komponen dalams
truktur, dapat menggunakan salah satu cara di bawah ini:

(*p_struktur).nama_komponen

, atau

p_struktur->nama_komponen

Kapan saya harus menggunakan pointer ?

Seperti yang saya katakan tadi, kita tidak harus selalu menggunakan


pointer dalam program. Namun, ada beberapa kasus tertentu yang menyarankan
menggunakan pointer daripada cara biasa. Karena terbukti, dengan pointer
performa program akan lebih optimal.

30
Kita bahas dulu, mengapa pointer diciptakan?

Jadi zaman dulu, memori komputer itu sangat terbatas. Saat mengelola
struktur data kompleks seperti data pada array, linked list, tree, dan sebagainya..
sering kali memakan banyak memori. 2

Oleh sebab itu, diciptakanlah pointer agar mudah membuat struktur data
tersebut, dan tentunya lebih hemat memori.

Studi Kasus: Pointer untuk pass by reference

Petama kita akan coba menggunakan pointer untuk melakukan  passing argumen


berdasaran referensinya (pass by reference).

Contoh:

Pada program ini, kita membuat fungsi dengan nama add_score() untuk


menambahkan nilai score sebanyak 5.

Tapi ketika dijalankan:

31
Nilai variabel score tidak berubah, ia tetap bernilai 0.

Mengapa?

Ini karena kita melakukan pass by value, bukan pass by reference.

Variabel score kan dibuat di dalam fungsi main(), lalu ketika fungsi add_score() men
coba mengubah nilainya,

maka perubahan hanya terjadi secara lokal di dalam fungsi add_score()  saja. Coba
buktikan dengan mengubah fungsi add_score() menjadi seperti ini:

Hasilnya:

32
Benar kan yang saya katakan.Nilai score pada fungsi add_score() sudah berubah
menjadi 5, namun variabel score pada fungsi main() akan tetap bernilai 0.

Nah..

Di sinilah kita harus menggunakan pointer untuk melakukan pass-by-reference.

Sekarang, coba ubah kode programnya menjadi seperti ini:

Karena argumen fugsi add_score()  kita ubah menjadi pointer, maka kita harus
memberikan alamat memori saat memanggilnya.

Maka hasilnya:

Setiap fungsi add_score() dipanggil atau dieksekusi, maka nilai variabelnya akan
bertambah 5.

Coba kita ubah menjadi seperti ini:

33
Hasilnya:

34
KESIMPULAN

1. Pointer adalah sebuah variabel yang berisi alamat lain. Suatu pointer
dimaksudkan untuk menunjukkan ke suatu alamat memori sehingga
alamat dari suatu variabel dapat diketahui dengan mudah.

2. Pointer digunakan untuk mengakses langsung ke memori


penyimpanan.Variabel pointer dideklarasikan dan diberikan tipe data
sesuai dengan data yang akan ditunjuknya.

3. Menggunakan operator deference variabel akan menghasilkan alamat


lokasi memori, sedangkan menggunakan operator reference akan
dihasilkan nilai yang berada pada suatu alamat memori.
DAFTAR PUSTAKA

H.M, Jogiyanto.2008.”Konsep Dasar Bahasa Pemrograman C”.Informatika


Rachmat, Antonius.2010."Algoritma dan Pemrograman dengan Bahasa
C".Yogyakarta : ANDI.

36

Anda mungkin juga menyukai