Jumat, Juli 31, 2015

Programming in C - Part 15: Pointer dalam bahasa C - Tambahan.

Untuk lebih memahami cara kerja pointer, perhatikan dua listing kode berikut ini :

#include <stdio.h>

int main(void)
{
/* ====================
 * List berikut ini  mendemonstrasikan penggunaan pointer of pointer
 * Cara 1 :
 */  

    int b = 14;
    int *a = NULL;
    int *c = NULL;       // satu bintang

    a = &b;
    c = a;                // tanda & dihilangkan !
    
    printf ("\nHasil dari Cara 1 :\n");

    printf("%d\t", *a);     // mencetak 14
    printf("%d ",  *c);     // mencetak 14

/* ====================
 * List berikut ini  mendemonstrasikan penggunaan pointer of pointer
 * Cara 2 :
 */
    int p = 14;
    int *q = NULL;
    int **r = NULL;            // tanda double **
    int ***n = NULL;            // tanda triple ***

    q = &p;
    r = &q;                    // tanda & digunakan
    n = &r  ;
    printf ("\nHasil dari Cara 2 :\n");
    printf("%d\t", *q);     // mencetak 14
    printf("%d\t", **r);     // mencetak 14   **
    printf("%d\t", ***n);     // mencetak 14  ***

    return 0;
}
 

Penjelasan Cara 1

Sebuah variabel integer dibuat dan isi angka 14. Variabel ini diberi nama b.
Dua buah pointer yang diberi nama a dan b dibuat tetapi diarahkan ke NULL (suatu tempat yang tidak ada.)
a = &b ;
Perintah di atas akan mengarahkan pointer a ke alamat memori b.  Pada posisi ini, jika kita akan melihat NILAI dari pointer a
kita harus menggunakan tanda *.
jadi *a akan berNILAI 14.  Untuk memudahkan anda bisa bayangkan selembar kertas berwarna merah bertuliskan angka b = 14. Selanjutnya a memfoto copy kertas asli tersebut dengan mesin foto copy berbentuk &. tentu saja hasilnya persis sama, kecualiwarna kertas yang menjadi hitam (foto copy hitam putih). Untuk dapat melihat hasil yang persis sama dengan aslinya (warna kertas merah), maka harus menggunakan sebuah kaca pembesar berbentuk bintang (*). Dengan demikian *a akan bernilai 14. Pemikiran ini akan membawa kita kepada kesimpulan bahwa kaca pembesar * hanya berfungsi jika yang ingin dilihat adalah variabel hasil fotocopy
c = a ;
perintah ini mengarahkan pointer c ke pointer a, dimana pointer a sendiri mengarah ke b. Pada posisi ini, jika kita akan melihat NILAI dari pointer c maka kita harus melihat dulu NILAI dari pointer a yang mengarah pada b dengan ISI 14.
Secara mental kita dapat membayangkan bahwa c melihat kertas hasil fotocopy yang dipegang a, dengan kata lain a dan c melihat selembar kertas yang sama yaitu fotocopian dari b. Dengan logika yang sama kita bisa katakan bahwa jika si c ingin melihat hasil yang sebenarnya, maka harus menggunakan kaca pembesar *. Dengan demikian *c akan bernilai 14.

Anda juga bisa membayangkan secara mental bahwa sebuah pointer( ditandai dengan tanda *) hanya bisa berisi fotocopy. Dikemudian hari anda akan segera menyadari bahwa ternyata pointer sangat cerdik sehingga kertas asli dapat berubah jika hasil fotocopynya diubah (dua arah). Artinya bahwa perubahan pada fotocopy dapat merubah aslinya sehingga sama dengan fotocopiannya. Tapi pada saat ini kita fokus bahas yang satu arah dulu
 

Penjelasan cara 2

Penjelasannya sama dengan cara 1 kecuali bahwa r didekalarasikan sebagai sebuah pointer yang berisi pointer. (pointer of pointer)

q = &p artinya q memfotocopy p.
r = &q artinya r memfotocopy hasil fotocopian dari q.

*q akan bernilai 14. Anda pasti ingat penjelasan foto copy dan kaca pembesar di atas.
*r akan bernilai BUKAN 14. karena satu kaca pembesar tidak bisa digunakan untuk melihat sesuatu yang sudah difotocopy dua kali.
**r akan bernilai 14 karena saat ini anda menggunakan dua kaca pembesar untuk melihat asli dari kertas yang difotocopy dua kali. Demikian seterusnya. Secara umum, jumlah kaca pembesar * yang dibutuhkan untuk melihat hasil asli sama dengan jumlah kali foto copy. perhatikan pointer n pada list 2.

Jika anda menggunakan kaca pembesar lebih dari seharusnya, maka akan muncul error

error: invalid type argument of unary ‘*’ (have ‘int’)

Jadi jumlah &&& harus sama dengan *** !. Ini juga berarti bahwa jika anda ingin membuat pointer yang akan digunakan untuk melihat foto copy dari foto copian ( 2 kali foto copy) maka anda harus mendeklarasikan dengan dua tanda bintang (**). demikian seterusnya.

0 comments:

Posting Komentar

Write your comment here