Struktur Pointer 109
IX POINTER IX.1 Pendahuluan
- Pointer adalah suatu variabel yang menyimpan alamat dari suatu data, dan bukan menyimpan datanya sendiri.
- Sebagai contoh, jika px adalah pointer dan x adalah variabel yang ditunjuk oleh px, maka jika px berada pada alamat memori awal 1000, maka px akan berisi 1000, sedangkan datanya sendiri berupa nilai yang ada pada lokasi memori 1000.
1000
?
zzzz
1000
alamat
x
px menunjukke variabel x
Gambar 9.1 Variabel pointer px menunjuk ke variabel x. IX.2 Pendeklarasian Variabel Pointer
- Variabel tipe pointer dideklarasikan dengan bentuk sebagai berikut:
type *nama_variabel;
- dengan tipe dapat berupa sembarang tipe data, sedangkan
nama_variabel adalah nama dari variabel pointer. Sebagai contoh: int px; /* contoh1*/ char pch1, pch2; /*contoh2*/
- Contoh pertama menyatakan bahwa px adalah variabel pointer
yang menunjuk ke suatu data bertipe int. - Pada contoh kedua, masing-masing variabel pch1 dan pch2 adalah
variabel pointer yang menunjuk ke data bertipe char.
char *pch1, *pch2;tanda akhirpernyataan deklarasi
menyatakanvariabel pointer
nama variabelpointertipe data yang
ditunjuk olehvariabel pointer
Gambar 9.2 Ilustrasi pendeklarasian variabel pointer.
Struktur Pointer 110
IX.3 Mengatur Pointer Agar Menunjuk ke Variabel Lain
- Agar suatu pointer menunjuk ke variabel yang lin, 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.
IX.4 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. - Contoh program berikut memperlihatkan pemakaian variabel
pointer.
Struktur Pointer 111
/* --------------------------------- */ /* File program : Pointer.c */ /* Contoh pemakaian pointer */ /* -------------------------------- */ #include <stdio.h> main() { int x,y; /* x dan y bertipe int */ int *px; /* px pointer yang menunjuk */ /* obyek bertipe int */ x = 87; px = &x; /* px berisi alamat dari x */ y = *px; /* y berisi nilai yang ditunjuk px */ printf("Alamat x = %p\n", &x); printf("Isi px = %p\n", px); printf("Isi x = %d\n", x); printf("Nilai yang ditunjuk px = %d\n", *px); printf("Nilai y = %d\n", y); } Contoh eksekusi: C> Pointer Alamat x = 5B87:2230 Isi px = 5B87:2230 Isi x = 87 Nilai yang ditunjuk px = 87 Nilai y = 87 Program 9-1.
- Pada program di atas, dua pernyataan px = &x; y = *px;
- sebenarnya dapat digantikan dengan sebuah pernyataan y = x;
Struktur Pointer 112
IX.5 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 brtipe int.
IX.6 Mengubah Isi Suatu Variabel Melalui Pointer
- Contoh berikut memberikan gambaran tentang pengubahan isis suatu variabel secara tak langsung (yaitu 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 brarti “jumlahkan isi variabel yang ditunjuk oleh
pd dengan 10 dan simpan hasilnya ke variabel tersebut”, atau identik dengan pernyataan:
D = d + 10;
- Namun seandainya tidak ada instruksi
Pd = &d;
- maka pernyataan:
*pd = *pd + 10;
Struktur Pointer 113
- tidak akan sama dengan
d = d + 10; /* ---------------------------------- */ /* File program : Pointer2.c */ /* Pengubahan isi pointer */ /* -------------------------------- */ #include <stdio.h> 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); } Contoh hasil eksekusi: C> Pointer2 Isi d semula = 54.6 Isi d kini = 64.6 Program 9-2 IX.7 Pointer dan Array
- Hubungan antara struktur data pointer dan array dalam C sangatlah erat, sebab sesungguhnya array secara internal akan diterjemahkan dalam bentuk pointer.
- Contoh berikut akan memberi gambaran tentang hubungan antara pointer dan array. Misalnya dalam suatu fungsi dideklarasikan:
static int tgl_lahir[3] = { 01, 09, 64 };
- dan
int *ptgl;
Struktur Pointer 114
- 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. - Contoh di atas dapat dipahami melalui contoh program berikut ini.
/* ------------------------------------------- */ /* File program : Pointer3.c */ /* Pointer yang menunjuk array */ /* ------------------------------------------- */ #include <stdio.h> main() { static int tgl_lahir[] = {24, 6, 1965 }; int *ptgl; ptgl = tgl_lahir; /* ptgl berisi alamat array */ printf("Nilai yang ditunjuk oleh ptgl = %d\n", *ptgl); printf("nilai dari tgl_lahir[0] = %d\n", tgl_lahir[0]); } Contoh hasil eksekusi: C>Pointer3 Nilai yang ditunjuk oleh ptgl = 24 Nilai dari tgl_lahir[0] = 24 Program 9-3
Struktur Pointer 115
- Jika ingin menampilkan seluruh elemen array tgl_lahir, maka dapat digunakan perintah
for(i=0; i<3; i++) printf(“%d%, tgl_lahir[i]);
- Jika diimplementasikan dengan menggunakan pointer
tgl_lahir[i]
- dapat digantikan menjadi
*(ptgl + i)
- dengan terlebih dahulu mengatur ptgl agar menunjuk ke array
tgl_lahir, sehingga penulisan instruksi penampilan isi array tgl_lahir dapat diubah menjadi:
ptgl = tgl_lahir; for (i=0; i<3; i++0 printf(“%d “, *(ptgl + i));
- Secara umum operasi pointer dapat diterangkan sebagai berikut.
Misalkan a adalah suatu array, dan pa adalah pointer yang menunjuk array a, maka
*(pa + i)
- akan menyatakan elemen array dengan indeks sama dengan i. - Jadi
*(pa + 0) identik dengan a[0] *(pa + 1) identik dengan a[1] *(pa + 2) identik dengan a[2]
- Ungkapan seperti
pa + i
- memiliki arti “tambahkan nilai pa (berisi alamat) dengan i kali
ukuran dari obyek yang ditunjuk oleh pa”. - Jika pa dideklarasikan sebagai
int *pa;
Struktur Pointer 116
- maka obyek dari pa adalah data int (berukuran 2 byte). - Cara lain dalam menampilkan isi suatu array yaitu dengan
menaikkan isi variabel pointer dengan menggunakan operator ++.
*(ptgl + i) - dapat diganti menjadi ptgl++
- Misalkan suatu instruksi:
int *pa; int a[3];
- Sesudah pernyataan: pa = a;
pa
array a
0 1 2 indeks
- Sesudah pernyataan: pa++;
pa
array a
0 1 2 indeks
IX.8 Array Dari Pointer
- Suatu array dapat digunakan untuk menyimpan sejumlah pointer. Misal pernyataan:
char *namahari[10];
Struktur Pointer 117
- merupakan pernyataan untuk mendeklarasikan array pointer. - Array namahari terdiri dari 10 elemen berupa pointer yang
menunjuk ke data bertipe char.
IX.9 Inisialisasi Array
- Array pointer dapcontoh:
Static char * { “Senin “Selas “Rabu “Kam “Jum’ “Sabtu “Ming };
- Pada contoh di at
namahari[0namahari[1namahari[2dan seterusn
Gambar 9.3 Array Pointer.
?
?
?
?
xxxx
namahari
Pointer
at diinisialisasi sewaktu pendeklarasian. Sebagai
namahari[ ] = ”, a”, ”, is”, at”, ” , gu”
as,
] menunjuk ke string “Senin” ] menunjuk ke string “Selasa” ] menunjuk ke string “Rabu” ya.
Struktur Pointer 118
454
xxxx
namahari
418
424
431
436
442
448
454
418
424
448
442
436431
S E N I N \0
S E L A S A \0
R A B U \0
K A M I S \0
J U M A T \0
S A B T U \0
M I N G G U \0
Gambar 9.4 Array pointer yang menunjuk data string. IX.10 Pointer Menunjuk Pointer
- Suatu pointer bisa saja menunjuk ke pointer lain. Gambar 9.5 memperlihatkan contoh mengenai hal ini.
Variabelvar_x
Pointerptr2
alamatptr1
alamatvar_x nilai
Pointerptr1
Gambar 9.5 Pointer yang menunjuk ke pointer.
- Untuk membentuk rantai pointer seperti pada gambar di atas, diperlukan pendeklarasian sebagai berikut:
int var_x; int *ptr1; int **ptr2;
- Perhatikan bahwa pada deklarasi di depan:
o var_x adalah variabel bertipe int. o ptr1 adalah variabel pointer yang menunjuk ke data bertipe
int.
Struktur Pointer 119
o 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 program berikut memberikan gambaran cara pengaksesan nilai pada var_x melalui pointer ptr1 dan ptr2.
/* ------------------------------------------- */ /* File program : Ptrptr.c */ /* Contoh pointer menunjuk pointer */ /* ------------------------------------------- */ #include <stdio.h> main() { int var_x = 234; /* variabel int */ int *ptr1; /* pointer int */ int **ptr2; /* pointer menunjuk pointer int */ ptr1 = &var_x; /* ptr1 berisi alamat var_x */ ptr2 = &ptr1; /* ptr2 berisi alamat ptr1 */ /* Mengakses nilai var_x melalui ptr1 */ printf("Nilai var_x = %d\n", *ptr1); /* Mengakses nilai var_x melalui ptr2 */ printf("Nilai var_x = %d\n", **ptr2); } Contoh hasil eksekusi: C>Ptrptr Nilai var_x = 234 Nilai var_x = 234 Program 9-4
Struktur Pointer 120
IX.11 Pointer dan Fungsi
- Variabel pointer dapat digunakan sebagai parameter dalam suatu fungsi.
- Dalam kaitan ini pointer dapat sebagai: o Parameter fungsi o Keluaran fungsi
IX.11.1 Pointer Sebagai Parameter Fungsi
- Penerapan pointer sebagai parameter fungsi yaitu jika diinginkan agar nilai suatu variabel internal dapat diubah oleh fungsi yang dipanggil.
- Misal pada fungsi berikut:
void naikkan_nilai (int *x, int *y) { *x = *x + 2; *y = *y + 2; }
- Fungsi di atas dimaksudkan agar jika dipanggil, variabel yang
berkaitan dengan parameter aktual dapat diubah nilainya, yaitu masing-masing dinaikkan sebesar 2.
- Contoh pemanggilan fungsinya adalah
naikkan_nilai(&a, &b);
- Perhatikan bahwa dalam hal ini variabel a dan b harus ditulis diawali dengan operator alamat (&) yang berarti menyatakan alamat variabel, sebab parameter fungsi dalam pendefinisian berupa pointer.
Program 9-5 IX.11.2 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.
Struktur Pointer 121
Char *nama_bulan(int n) { static char *bulan[ ] =
{ “Kode bulan salah”, “Januari”, “Pebruari”, “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 bertipe char (atau string).
- Dalam fungsi nama_bulan( ), mula-mula array bernama bulan dideklarasikan dan sekaligus diinisialisasi agar menunjuk ke 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: o string “Kode ulan salah” (bulan[0]) jika masukan fungsi (n<1
atau n>12) o bulan[n] untuk n yang terletak antara 1 sampai 12
- Contoh program berikut akan memperjelas keterangan di atas. /* ----------------------------------------------- */ /* File program : Ptrbulan.c */ /* Contoh fungsi dengan keluaran berupa */ /* pointer yang menunjuk string */ /* ----------------------------------------------- */
Struktur Pointer 122
#include <stdio.h> char *nama_bulan(int n); main() { int bl; printf("Bulan (1 .. 12): "); scanf("%d", &bl); printf("%s\n", nama_bulan(bl)); } char *nama_bulan(int n) { static char *bulan[] = { "Kode bulan salah", "Januari", "Pebruari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "Nopember", "Desember" }; return((n<1 || n>12) ? bulan[0] : bulan[n]); } Contoh hasil eksekusi : C>Ptrbulan Bulan (1 .. 12) : 14 Kode bulan salah C>Ptrbulan Bulan(1 .. 12) : 3 Maret Program 9-6
Top Related