Algoritma & Struktur Data

Jumat, 04 Mei 2012 0 komentar


Pointer
Adapun hal yang melatarbelakangi dalam penyusunan tulisan ini adalah untuk memahami dan mempelajari dari salah satu materi matakuliah Algoritma dan Struktur Data, yaitu bab Pointer. Hal ini mengingat bahwa pointer adalah salah satu bab yang dirasa cukup berat dan menjadi dasar untuk bab-bab selanjutnya dalam perkuliahan Algoritma dan Struktur Data yang selanjutnya. Karena dengan pemahaman yang cukup pada bab Pointer ini, diharapkan dapat mempermudah untuk pemahaman bab selanjutnya yang mengharuskan dalam penggunaan pointer.
BAB II
ISI
DASAR POINTER
Pointer adalah variabel yang berisi alamat memori sebagai nilainya, berbeda dengan variabel biasa yang berisi nilai tertentu. Memori dapat dianalogikan sebagai suatu kota, dan alamat memori diibaratkan sebagai rumah-rumah. Di dalam suatu kota terdapat rumah-rumah yang memiliki alamat tertentu yang unik (tidak ada yang sama). Demikian juga sistem operasi yang akan mengorganisasikan memori dengan nomor berurutan secara unik. Penentuan letak memori dalam deklarasi variabel dilakukan oleh compiler dan sistem operasi pada saat runtime.
Bentuk umum dari pernyataan variabel pointer adalah : <type> *<nama_variabel>
Untuk mengetahui alamat dari variabel tersebut, digunakan operatorampersand sign (&). Dan untuk mengakses nilai dari alamat yang disimpan pada variabel digunakan operator asterisk (*) .Contoh sederhana penggunaan pointer :
//pinter_pointer1.cpp
#include<stdio.h>
void main()
{
int *pointer,bukanPointer,nilai;
nilai=20;
bukanPointer=nilai;
pointer=&nilai;
printf(“Variabel bukanPointer : %d”,bukanPointer);
printf(“\nVariabel *pointer : %d”,*pointer);
printf(“\nAlamat variabel *pointer : %d”,pointer);
}
Dari perintah di atas akan ditampilkan hasil :
Variabel bukanPointer : 20
Variabel *pointer : 20
Alamat variabel *pointer : 8744
Ada beberapa hal yang perlu kita pahami dan perhatikan dalam pendeklarasian variabel pointer :
  1. Kita tidak dapat meng”assign” nilai dalam variabel pointer seperti pada variabel biasa apabila bukan variabel array. Misal :
pointer=nilai ;            // ini bakalan salah lho!!!
bukanPointer=pointer;      // ini juga salah
  1. Kurang dalam menginisialisasikan atau mendeklarasikan pointer
*pointer=nilai ;     // salah karena belum menunjuk ke suatu alamat
POINTER SEBAGAI PARAMETER
Pointer dapat juga digunakan sebagai parameter fungsi. Pointer dilewatkan ke dalam fungsi melalui nilainya (passing by value). Misalkan seperti fungsi menukar nilai di bawah ini
//pinter_pointer2.cpp
#include<stdio.h>
void tukarNilai(int *j, int *k)
{
int temp;
temp=*j;
*j=*k;
*k=temp;
}
void main()
{
int a=20,b=10;
printf(“nilai a : %d dan nilai b : %d”, a, b);
tukarNilai(&a,&b);
printf(“\nnilai a : %d dan nilai b : %d”, a, b);
}
Di sini dapat dilihat bahwa variable pointer dapat dilewatkan melalui fungsi sebagai parameter. Dalam fungsi tukarNilai hanya dilewatkan alamatnya saja (tukarNilai(&a,&b);) dan di dalam fungsi ini barulah proses pertukaran dimulai. *j dan *k nilainya sama dengan a dan b, kemudian *j dan *k barulah dipertukarkan kedua nilainya.
POINTER VOID
Pointer tipe void adalah pointer tipe khusus, yang dapat menunjuk sembarang tipe data dari nilai integer ke suatu string character. Kelemahannya adalah data yang ditunjuk tidak dapat mengacu secara langsung dan panjangnya tidak tertentu. Oleh karena itu, dibutuhkan type casting untuk mengubah void pointer ke suatu pointer dari suatu concrete data type dimana kita dapat mengacu padanya.
//pinter_pointer3.cpp
#include<iostream.h>
void increase(void *data,int type)
{
switch (type)
{
case sizeof(char): (*((char*)data))++;break;
case sizeof(short): (*((short*)data))++;break;
case sizeof(long): (*((long*)data))++;break;
}
}
void main()
{
char a=5;
short b=9;
long c=12;
increase(&a,sizeof(a));
increase(&b,sizeof(b));
increase(&c,sizeof(c));
cout<<(int)a<<”,”<<b<<”,”<<c;
}
Output : 6,10,13
Kita tidak dapat langsung mengoperasikan pointer dengan tanda asterisk (*) karena setiap data memiliki tipe yang berbeda-beda. Type casting digunakan untuk solusi masalah di atas.
POINTER UNTUK STRUKTUR DATA DINAMIK
Struktur data dinamik adalah struktur data yang dapat bertambah maupun berkurang sesuai dengan kebutuhan di saat program berjalan. Struktur data dinamik dapat mengalokasikan blok-blok memori sesuai dengan yang diinginkan dalam program yang dirangkai (link) dengan menggunakan struktur pointer. Bila blok memori tidak digunakan lagi, maka blok memori tersebut dilepas untuk keperluan yang lain.
//pinter_pointer4.cpp
#include <stdio.h>
#include <stdlib.h>
void main()
{
int *p;
p=(int *) malloc (sizeof(int));
*p=10;
printf(“%d\n”,*p);
free(p);
}
Perintah malloc digunakan untuk mengalokasikan memori dengan jumlah tertentu, dalam hal ini adalah ukuran memori dari integer, yaitu 4 byte. Type casting dilakukan supaya mengubah pointer generic (pointer void) yang dihasilkan oleh malloc menjadi pointer integer. Fungsi free digunakan untuk melepaskan blok memori yang tidak digunakan.
POINTER DAN ARRAY
Array dapat diakses dengan pointer.  Contoh :
int huruf[20], *h;
h=huruf;
Dalam hal ini h akan berisi elemen pertama dari array huruf atau sama artinya dengan h=&huruf[0]; yang juga berarti bahwa h adalah pointer ke integer tunggal. Bentuk penulisan pointer dalam mengakses array bervariasi, untuk jelasnya dapat dilihat contoh berikut
//(pinter_pointer5.cpp) :
#include<stdio.h>
void main()
{
int huruf[5],*h;
h=huruf;*h=10;
h++; *h=20;
h=&huruf[2]; *h=30;
h=huruf + 3; *h=40;
h=huruf; *(h+4)=50;
for(int i=0;i<5;i++)
{
printf(” %d”,h[i]);
}
}
Dalam contoh di atas dapat dilihat bentuk penulisan yang berbeda-beda dalam mengakses elemen array. Contoh di atas akan menghasilkan : 10 20 30 40 50
POINTER ARITMATIKA
Pointer dapat diberikan operator berdasarkan ukuran masing-masing tipe datanya. Hanya 4 operator yang dapat dikenakan pada pointer, yaitu : ++,–,+ dan -. Misalkan saja didefinisikan sebagai berikut :
int *pointer;
pointer++;
Dari contoh di atas dapat dijelaskan bahwa alamat memori dari variabel pointer akan bertambah 1, misalkan alamat variabel pointer adalah 8774, maka pointer++;, menyebabkan alamat bertambah 1 menjadi 8775.
POINTER PERBANDINGAN
Pointer dapat dibandingkan dengan menggunakan operator hubungan, seperti !=, ==, <, dan >.Contoh :
//(pinter_pointer6.cpp)
#include <iostream.h>
int main()
{
int num[10];
int *start, *end;
start = num;
end = &num[9];
while(start != end) {
cout << “Masukkan bilangan sebanyak 9 data : “;
cin >> *start;
start++;
}
return 0;
}
Data yang akan dimasukkan sebanyak 9 buah data dan program tidak akan berhenti apabila belum sampai 9 buah data.
POINTER TO POINTER
C++ memungkinkan pemakaian pointer untuk menunjuk pada pointer, dalam hal ini adalah menunjuk data.  Hal ini dapat dilakukan dengan menambahkan tanda asterisk (*) di setiap tingkatan referensinya.
char a;
char * b;
char ** c;
a=’z’;
b=&a;
c=&b;
Dimisalkan apabila alamat a = 7001, b= 4500, dan c = 3303, dapat dijelaskan sebagai berikut :
Variabel c akan memiliki nilai yang berbeda, yaitu :
c adalah variabel tipe (char**) dengan nilai 4500
*c adalah variabel tipe (char*) dengan nilai 7001
**c adalah variabel tipe (char) dengan nilai ’z’
BAB III
KESIMPULAN
Adapun kesimpulan yang didapat adalah :
  1. Pointer adalah variable yang menyimpan alamat memori. Operator (&) digunakan untuk mendapatkan alamat dari suatu variabel dan operator (*) digunakan untuk mendapatkan nilai pada alamat yang tersimpan dalam pointer.
  2. Pointer dideklarasikan dengan tanda asterisk (*)
  3. Pointer dapat dilewatkan sebagai parameter dalam fungsi
  4. Struktur data dinamik dapat dibangun dengan menggunakan pointer
  5. Pointer dan array memiliki perbedaan dan persamaan
  6. Suatu pointer dapat menunjuk kepada pointer yang lain

0 komentar:

Posting Komentar

 

©Copyright 2011 ILMU PENGETAHUAN | TNB