Struktur Data (Data Structure) – IS 2313

Imam Rozali, S.T., M.T.

Struktur Data
(Data Structure) – IS 2313

Chapter 2 : Pointer

Outline
















KONSEP DASAR POINTER
Pendeklarasian Variabel Pointer
Mengatur Pointer Agar Menunjuk ke Variabel Lain
Operasi pada Pointer
Mengakses Isi Suatu Variabel Melalui Pointer
Tipe Variabel Pointer dan Tipe Obyek Yang Ditunjuk
Pointer dan Array
Array Dari Pointer
Inisialisasi Array Pointer
Pointer Menunjuk Pointer
Pointer dan Struct
Pointer dan Tipe Data String
Pointer Sebagai Parameter Fungsi
Pointer Sebagai Keluaran Fungsi

KONSEP DASAR POINTER
 Pointer (variabel penunjuk) adalah suatu
variabel yang berisi alamat lokasi suatu memori

tertentu.
 Jadi isi dari variabel pointer merupakan alamat
dari lokasi memori yang digunakan untuk
menyimpan data dan bukan nilai data itu sendiri.

 Jika variabel merupakan isi memori, dan untuk
mengakses isi memori tersebut diperlukan
address, lalu bagaimana cara kita mengetahui
alamat dari suatu variabel ?

Pendeklarasian Variabel Pointer
type *nama_variabel;
int px; /* contoh1*/
char
pch1,
/*contoh2*/

pch2;

Mengatur Pointer Agar

Menunjuk ke Variabel Lain
 Agar suatu pointer menunjuk ke variabel yang
lain, mula-mula pointer harus diisi dengan
alamat dari variabel yang akan ditunjuk. Untuk
menyatakan alamat dari suatu variabel, dapat
digunakan operator & (operator alamat, yang
bersifat unaray), dengan cara menempatkan
operator di depan nama variabel.
 Sebagai contoh, jika x dideklarasikan sebagai
variabel bertipe int, maka &x berarti “alamat dari
variabel x”.

 Adapun contoh pemberian alamat 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.


Operasi pada Pointer
 Operasi Penugasan
 Suatu variable pointer seperti halnya variable yang lain, juga
bisa mengalami operasi penugasan. Nilai dari suatu variable
pointer dapat disalin ke variable pointer yang lain. Operator (&)
dalam kaitannya dengan pointer adalah operator yang
mengembalikan alamat memori dari operandnya.
 Operasi Aritmatika
 Suatu variabel pointer hanya dapat dilakukan operasi aritmatika
dengan nilai integer saja. Operasi yang biasa dilakukan adalah
operasi penambahan dan pengurangan. Operasi penambahan
dengan suatu nilai menunjukkan lokasi data berikutnya (index
selanjutnya) dalam memori. Begitu juga operasi pengurangan.

Operasi Penugasan
int y = 5;
/*deklarasi variabel y*/
int *yPtr; /*deklarasi variabel pointer yPtr*/
yPtr = &y; /*mengisi variabel pointer yPtr dengan alamat

dari variabel y*/

#include
Int main()
{
Int i;
Int *ia;
i = 10;
ia = &i;
printf (“Alamat dari i adalah %p\n”,ia);
printf (“Nilai i adalah %d\n”,i);
printf (“Nilai dari pointer ia adalah %d\n”,*ia);
*ia=50;
printf (“Nilai I sekarang adalah %d\n”,i);
printf (“Alamat dari i adalah %p\n”,&i);
return 0;
}

Operasi Aritmatika
 Asumsikan kita telah mendeklarasikan sebuah array float v[5], dan

anggap elemen pertamanya berada pada lokasi 3000 di memori.
Lalu kita deklarasikan sebuah variabel pointer *vPtr, ada dua cara
untuk mengisi variabel pointer *vPtr dengan alamat dari elemen
pertama array v, yaitu :
float *vPtr = v;
float *vPtr = &v[0];

 Jika kita melakukan operasi aritmatika seperti:

vPtr += 2;
dalam perhitungan aritmatika biasa, maka vPtr yang semula berisi 3000
menjadi 3000 + 2 = 3002, namun ini tidak berlaku pada pointer. Operasi
aritmatika pada pointer di atas artinya adalah vPtr yang semula menunjuk
pada v[0] sekarang menunjuk ke v[2].
 Karena vPtr menunjuk alamat memori dari variabel v yang bertipe float,
maka vPtr sekarang berisi 3008 (3000 + 2 * 4).

#include
int main()
{

float nilai[i3]l, *petunuuk;
nilai[i0l = 220;
nilai[i0l = 641;
nilai[i0l = 53];
penunuuk = &nilai[i0l;
printf(“Nilai
%f ada
n”,*penunuuk,penunuuk);
printf(“Nilai
%f ada
n”,*(penunuuk+1),penunuuk+1);
printf(“Nilai
%f ada
n”,*(penunuuk+1),penunuuk+2);

di

alamat

%p\


di

alamat

%p\

di

alamat

%p\

Mengakses Isi Suatu Variabel
Melalui Pointer
 Jika suatu variabel sudah ditunjuk oleh pointer, maka variabel
tersebut dapat diakses melalui variabel itu sendiri (disebut sebagai
pengaksesan tak langsung), ataupun melalui pointer (disebut
pengaksesan langsung).
 Pengaksesan tak langsung dilakukan dengan menggunakan

operator inderection berupa simbol * (bersifat unaray), seperti
contoh berikut:
*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 sesuai dengan nilai x.

/* --------------------------------- */
/* File program : Pointer.c */
/* Contoh pemakaian pointer */
/* -------------------------------- */
#include
main()
{
int x,y; /* x dan y bertipe int */
int *px; /* px pointer yang menunuuk obyek bertipe int */
x = 87;

px = &x; /* px berisi alamat dari x */
y = *px; /* y berisi nilai yang ditunuuk px */
printf("Alamat x = %p\n", &x);
printf("Isi px = %p\n", px);
printf("Isi x = %d\n", x);
printf("Nilai yang ditunuuk px = %d\n", *px);
printf("Nilai y = %d\n", y);
}

Tipe Variabel Pointer dan Tipe
Obyek Yang Ditunjuk
 Antara tipe pointer (sesuai dengan
pendeklarasian pointer) dan tipe obyek yang
akan ditunjuk oleh pointer haruslah sejenis. Jika
misalnya pointer pu dimaksudkan untuk
menunjuk data bertipe int maka data yang akan
ditunjuk oleh pointer pu juga harus bertipe int.
Suatu kesalahan akan terjadi jika misalnya
pointer float digunakan untuk menunjuk data
bertipe int.


Mengubah Isi Suatu Variabel
Melalui Pointer
 Mula-mula pd dideklarasikan sebagai pointer yang menunjuk ke suatu
data bertipe float dan d sebagai variabel bertipe float. Selanjutnya dengan
ungkapan:
d = 54.6;
digunakan untuk mengisikan nilai 54.6 secara langsung ke variabel d.
 Perintah :
pd = &d;
digunakan untuk memberikan alamat dari d ke pd. Dengan demikian pd
menunjuk ke variabel d.
 Sedangkan pernyataan berikut:
*pd = *pd + 10; (atau: *pd += 10;)
merupakan instruksi untuk mengubah nilai variabel d secara tak
langsung.
 Perintah di atas berarti “jumlahkan isi variabel yang ditunjuk oleh pd
dengan 10 dan simpan hasilnya ke variabel tersebut”, atau identik dengan
pernyataan:
D = d + 10;

/* ---------------------------------- */
/* File program : Pointer2.c */
/* Pengubahan isi pointer */
/* -------------------------------- */
#include
main()
{
float d, *pd;
d = 54.6;
printf("Isi d semula = %g\n", d);
pd = &d;
*pd = *pd + 10;
printf("Isi d kini = %g\n", d);
}

Pointer dan Array
 Misalnya dalam suatu fungsi dideklarasikan:
static int tgl_lahir[3] = { 01, 09, 64 };
int *ptgl;
 Kemudian diberikan pernyataan
ptgl = &tgl_lahir[0];
 maka ptgl akan berisi alamat dari elemen array tgl_lahir yang berindeks nol.
Instruksi di atas juga dapat ditulis menjadi:
ptgl = tgl_lahir;
sebab nama array tanpa tanda kurung menyatakan alamat awal dari array.
 Sesudah penugasan seperti di atas, maka
*ptgl
dengan sendirinya menyatakan elemen pertama (berindeks sama dengan
nol) dari array tgl_lahir.

/* ------------------------------------------- */
/* File program : Pointer3].c */ /* Pointer yang
menunuuk array */
/* ------------------------------------------- */
#include
main()
{
static int tgl_lahir[il = {24, 6, 1965 };
int *ptgl;
ptgl = tgl_lahir; /* ptgl berisi alamat array */
printf("Nilai yang ditunuuk oleh ptgl = %d\n",
*ptgl);
printf("nilai dari tgl_lahir[i0l = %d\n",

 Jika ingin menampilkan seluruh elemen array
tgl_lahir, maka dapat digunakan perintah
for(i=0; i