Memahami Tipe Data Integer (bagian 2)

May 21, 2016 8:54 AM

  ___       __                          
 |   .-----|  |_.-----.-----.-----.----.
 |.  |     |   _|  -__|  _  |  -__|   _|
 |.  |__|__|____|_____|___  |_____|__|  
 |:  |                |_____|           
 |::.|                                  
 `---' 
 









0x0B1. Tipe Array

Selama ini anda mendeklarasikan variabel dengan tipe data yang telah dijelaskan di sub bab sebelumnya. Satu hal yang harus anda fahami adalah bahwa variabel yang anda deklarasikan tersebut hanya bisa menyimpan satu buah data. Jadi di dalam satu buah variabel hanya berisi satu buah nilai. Tetapi sekarang ada tipe namanya tipe array, tipe ini memungkinkan kita untuk mengisikan beberapa buah data ke dalam satu buah variabel. Jadi satu buah variabel dapat menampung lebih dari satu data.


int id = 10; <– variabel id hanya bisa menampung satu data (10)
int score[5] = {40, 20, 70, 82, 58}; <== variabel score dapat menampung 5 buah data sekaligus
int fd[3];
char nama[7] = “suwardi”;
char ch_name[5] = {‘w’, ‘a’, ‘r’, ‘d’, ‘i’};
float rata2[3] = {5.06, 0.3, 4.5};

Contoh di atas, yang pertama adalah deklarasi variabel biasa dengan tipe integer menyimpan nilai 10. Sedangkan contoh kedua adalah variabel dengan tipe integer yang dapat menyimpan 5 buah nilai di dalamnya. Contoh deklarasi variabel yang kedua ini dapat langsung dituliskan anggota-anggota tiap elemenya. Contoh deklarasi variabel yang ketiga juga array yang dapat menampung tiga buah data, namun tidak langsung disebutkan isi datanya. Dalam menentukan jumlah elemen array, kita bisa langsung menentukan dengan bilangan di dalam kurung siku seperti pada contoh deklarasi kedua dan ketiga di atas. Namun untuk lebih efektifnya terutama dari segi performa, akan lebih baik jika jumlah elemen array kita tentukan dengan definisi konstan seperti contoh di bawah ini.

#define BUFF_LEN 512
unsigned char buffer[BUFF_LEN];

Array tersusun dalam bentuk elemen yang dapat diakses lewat index. Jika kita mengambil contoh variabel score yang telah dideklarasikan di atas, variabel itu dapat kita jabarkan sebagai berikut:

int score[5] = {40, 20, 70, 82, 58};

isi data | 40 | 20 | 70 | 82 | 58 |
—————————————————–
index/elemen | 0 | 1 | 2 | 3 | 4 |

Nah dari gambaran di atas dapat kita lihat bahwa variabel score adalah sebuah array yang memiliki lima buah data yang berada dalam lima buah elemen array. Simak saja, data pertama adalah 40 yang menempati index ke-0. Sedangkan data kedua adalah 20 yang menempati index ke-1, dan seterusnya.

Bagaimana cara mengakses array?. Sangat sederhana, hanya dengan menuliskan nama variabel kemudian diikuti oleh nomor index yang ditulis dalam kurung siku. Berdasarkan contoh deklarasi variabel score di atas, data-data yang ada di dalam variabel score dapat diakses dengan cara berikut:

score[0] <== untuk mendapatkan data di elemen ke-0 yaitu 40
score[1] <== untuk mendapatkan data di elemen ke-1 yaitu 20
score[3] <== untuk mendapatkan data di elemen ke-3 yaitu 82

Misalkan kita akan mencetak isi variabel score elemen ke-3 yaitu 82 sebagai berikut:

printf (“isi score elemen ke-3 yaitu: %d\n”, score[3]);

Ada kalanya nilai index yang berada di dalam kurung siku variabel array di atas dapat diganti-ganti secara otomatis. Contohnya ketika kita ingin mencetak isi array yang jumlah elemennya mencapai ratusan. Tidak mungkin kalau kita akan menuliskan elemennya satu persatu. Di sini pentingnya peranan loop untuk menyelesaikan masalah ini. Jadi dengan loop kita tinggal mengganti nomor index dengan nomor urutan loop yang sedang berjalan. Di bawah ini ada sebuah contoh perulangan (loop) untuk mencetak array score.

int score[5] = {40, 20, 70, 82, 58};
int i;
for (i = 0; i < 5; i++) printf (“score ke-%d = %d”, i, score[i]);

Perulangan di atas akan berjalan sebanyak 5 kali perulangan. Masing-masing perulangan akan mencetak isi score sesuai dengan index yang ditunjuk lewat i. Perulangan dengan for akan dibahas di sub bab selanjutnya dengan statemen.

0x0B2. Tipe Pointer

Di dunia pemrograman khususnya C, ada dua hal yang pasti ada, yaitu objek dan fungsi. Fungsi sudah jelas mengenai peranan maupun kegunaanya, seperti fungsi main adalah fungsi yang harus ada di dalam sebuah program yang ditulis dengan bahasa C. Objek biasanya berupa variabel. Sekarang, bagaiman hubungannya dengan pointer?. Hubungannya sangat erat, pointer dapat mereferensikan objek maupun fungsi. Nilai (isi yang ada) di dalam pointer adalah alamat objek atau fungsi. Contoh deklarasi pointer.

int *p; /* p adalah pointer (penunjuk) ke objek yang bertipe int */
char *explode; /* explode adalah pointer (penunjuk) ke objek yang bertipe char */
int (*fp)(); /* fp adalah pointer (penunjuk) ke fungsi yang mengembalikan tipe int */

Untuk lebih memahami konsep tentang pointer, sekarang kita ambil contoh tentang suasana belajar mengajar ketika berada di bangku sekolah, katakanlah SMA. Sewaktu proses belajar mengajar itu pak guru sedang menerangkan pelajaran matematika kepada para murid. Pak guru menggunakan stick untuk menunjuk apa yang tertulis di papan tulis saat menerangkan. Dari sini bisa kita fahami bahwa angka-angka yang tertulis di papan tulis dapat kita sebut sebagai data. Sedangkan stick yang digunakan pak guru untuk menunjuk angka-angka di papan tulis sewaktu menerangkan dapat kita sebut sebagai pointer. Jadi pendek kata, pointer adalah penunjuk, yang ditunjuk adalah data. Sehingga tidak heran jika pointer berisi alamat variabel. Karena untuk menunjuk sesuatu, kita harus tahu dimana letak sesuatu yang kita tunjuk itu berada. Untuk menujuk variabel di memori, otomatis harus tau letak alamat variabel itu berada.

Dengan pointer kita bisa mendapatkan alamat variabel, kita juga bisa mengakses isi variabel lain yang kita tunjuk. Bagaimana caranya?, di C ada dua operator yang sering dipakai dalam hal pointer. Yaitu operator * (karakter asteric) dan operator & (address operator). Perhatikan contoh di bawah ini.

int main() {
int i,j;
int *p, x;

p = &i;
printf (“isi p = %d\n”, p);

i = 10;
printf (“isi i = %d\n”, i);
printf (“isi p = %d\n”, p);

x = *p;
printf (“isi x = %d\n”, x);
printf (“isi p = %d\n”, p);

*p = 20;
printf (“isi i = %d\n”, i);

return 0;
}

//////// kompilasi \\\\\\\\

% cc p.c -o p
% ./p
isi p = -1073745020
isi i = 10
isi p = -1073745020
isi x = 10
isi p = -1073745020
isi i = 20

\\\\\\\\ end /////////

Dari contoh di atas kita dapat melihat bahwa pointer *p digunakan untuk mereferensikan variabel i. Kemudian ketika kita memberikan nilai pada *p maka secara otomatis nilai variabel i akan terganti. Jadi kita bisa mengakses variabel i via pointer *p.

Kaitan array dengan pointer
Sekarang waktunya untuk membahas rule antara pointer dan array. Kita sudah membahas tentang pointer dan array yang mendasar, sekarang kita tingkatkan levelnya dengan membahas hubungan antara array dan pointer. Pertama saya mempunyai sebuah variabel array yang bertipe char dan sebuah pointer yang juga bertipe char.

char nama[] = “wardi”;

Langkah selanjutnya, saya akan mengaitkan antara pointer *p dengan array nama. Dengan cara mereferensikan array nama ke pointer *p, menggunakan instruksi berikut.

char *p = nama;

Dengan satu baris kode di atas saja, kita telah mereferensikan array nama ke pointer p. Sehingga kita bisa mengakses tiap elemen di array nama menggunakan pointer *p. Dan Hubungan antara pointer *p dengan array nama dapat kita gambarkan sebagai berikut, Misalkan alamat elemen pertama array nama adalah AA11.

nama[] | ‘w’ | ‘a’ | ‘r’ | ‘d’ | ‘i’ |
————————————————
*p | AA11 | AA12 | AA13 | AA14 | AA15 |

Berdasarkan gambaran di atas, kita bisa mengakses isi array nama menggunakan variabel array nama maupun menggunkan pointer *p.

printf (“%c\n”, nama+2);
printf (“%c\n”, p+2);

Dua statemen di atas akan menghasilkan output yang sama yaitu karakter ‘r’ yang berada di index ke-2. Demgam adanya dua jalan untuk mengakses data yang sama dari array di atas, sekarang kita lanjutkan lagi mengenai akses menggunakan teknik array vi array dan via pointer.

putchar (nama[4]);
putchar (p[4]);

Dua baris kode di atas menghasilkan output yang sama. Jadi intinya ada bermacam-macam cara untuk mengakses isi array, salah satunya dengan menggunakan pointer. Berdasarkan hubungan antara array dan pointer sebagaimana yang telah di jelaskan di atas, kini kita bisa menulis rule dasar antara array dan pointer.

nama[i] equivalen dengan (*(nama+i))

Objek nama adalah array, sedangkan i adalah integer yang menentukan index array nama. Sekarang kita bisa mengembangkan ke bentuk-bentuk yang lain.

Jika nama[i] equivalen dengan (*(nama+i))
Maka &nama[i] equivalen dengan &(*(nama+i))

Sedangakan,

&nama[i] equivalen dengan &(*(nama+i))

ini sama halnya dengan,

&nama[i] equivalen dengan &*(nama+i)

Maka kita bisa menguranginya menjadi lebih sederhana

&nama[i] equivalen dengan nama+i

Ketika kita akan mengakses elemen ke-0 dari array nama atau katakanlah i = 0 maka tekniknya bisa kita jabarkan sebagai berikut:

nama[i] equivalen dengan (*(nama+i))
nama[0] equivalen dengan (*(nama+0))
nama[0] equivalen dengan *(nama+0)
nama[0] equivalen dengan *nama

Jadi jika,

&nama[0] equivalen dengan &*nama

Maka

&nama[0] equivalen dengan nama

Aneka rule di atas masih berbasis array satu dimensi, bagaimana dengan array yang mempunyai dimensi lebih dari satu?. Untuk array yang berdimensi lebih dari satu tidak begitu sulit. Kita ambil contoh misalkan array berdimensi dua.

flag[1][2] equivalen dengan *(flag[1] + 2)
flag[1][2] equivalen dengan (*(flag + 1))[2]

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=contoh kode=-=

/**
** Techniq0x1.c
** Array And Pointer Technique
**
** (C) heLL_c0d3 07
**/
#include

int main (argc, argv)
int argc;
char **argv;
{
char *p1 = argv[1], *p2 = argv[2];

if (argc != 3) fprintf (stderr, “usage: %s arg1 arg2\n”, *argv), exit (255);

printf (“argumen pertama: %s\n”, *(argv+1));
printf (“argumen pertama via pointer: %s\n”, p1);

printf (“argumen kedua: %s\n”, *(argv+2));
printf (“argumen kedua via pointer: %s\n”, p2);

printf (“argumen pertama elemen ke 3: \”%c\”\n”, (*(argv+1))[3]);
printf (“argumen pertama elemen ke 3via pointer: \”%c\”\n”, *(p1+3));

printf (“argumen kedua elemen ke 3: \”%c\”\n”, *(argv[2]+3));
printf (“argumen kedua elemen ke 3 via pointer: \”%c\”\n”, *(p2+3));

return 0x0;
}

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=kompilasi=-=

% cc techniq_0x0a.c -o techniq_0x0a2
techniq_0x0a.c:30:2: warning: no newline at end of file

% ./techniq_0x0a2
usage: ./techniq_0x0a2 arg1 arg2

% ./techniq_0x0a2 wardi rivero
argumen pertama: wardi
argumen pertama via pointer: wardi
argumen kedua: rivero
argumen kedua via pointer: rivero
argumen pertama elemen ke 3: “d”
argumen pertama elemen ke 3via pointer: “d”
argumen kedua elemen ke 3: “e”
argumen kedua elemen ke 3 via pointer: “e”
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

0 comments:

Article list :