Bab 9 Pointer 9.1 Pendeklarasian pointer Pointer adalah variabel yang menyimpan alamat memori dari variabel yang lain. Pointer juga memiliki tipe seperti halnya variabel biasa. Pointer dideklarasikan dengan cara menuliskan tipe data dari alamat memori yang ingin disimpan dan nama pointer didahului dengan tanda bintang (*). int *p; Setelah sebuah variabel pointer dideklarasikan, kita dapat meng-assign nilai ke pointer tersebut berupa alamat memori dari variabel yang lain dengan tipe yang sesuai. Untuk mendapatkan alamat memori dari sebuah variabel, digunakan tanda apostrophe (&). int *p; int x = 5; p = &y; Pada contoh di atas, p sekarang berisi nilai alamat memori dari y. Kita dapat menampilkan nilai alamat memori ini dengan menggunakan fungsi pustaka printf() dengan format %p. printf( %p, p); Untuk mendapatkan isi dari alamat memori yang ditunjuk oleh sebuah pointer, tuliskan nama pointer didahului dengan tanda bintang (*). Tipe data yang dikembalikan akan sesuai dengan tipe data pointer yang telah dideklarasikan sebelumnya. printf( %d, *p) ; 9.2 Pointer dan Array Pointer dan array memiliki hubungan yang erat. Nama variabel dari sebuah array, apabila tidak diikuti oleh tanda indeks array ([]), ekuivalen dengan alamat memori dari elemen pertama array tersebut. int array[5]; int *x; 1
x = &array[0]; /* Ekuivalen dengan x = array */ x = array; Lebih lanjut, setiap elemen dari array tersebut dapat diakses dengan menggunakan pointer yang telah ditunjuk dengan cara menambahkan indeks yang diinginkan ke pointer. printf( %d, *(x+2)) /*Ekuivalen dengan printf( %d, array[2]);*/ Secara umum, untuk sebuah array satu dimensi A, penulisan A[n] dimana n adalah sebuah indeks, ekuivalen dengan *(A+n), sedangkan &A[n] ekuivalen dengan A+n. Untuk sebuah array ganda, pengindeksan dengan pointer harus dilakukan dengan menggunakan pointer dari pointer. Sebagai contoh, apabila A adalah sebuah array dua dimensi, maka kedua pernyataan di bawah ini adalah ekuivalen. A &A[0][0]; Pengaksesan elemen dari sebuah array ganda dengan pointer menggunakan indeks secara sekuensial yang dihitung terurut mulai elemen pertama (indeks [0][0]). Sebagai contoh, apabila A adalah sebuah array dua dimensi dengan ukuran 10x5, maka elemen A[0][5] dapat diakses dengan menggunakan *((int*) A + 5). Sedangkan elemen A[2][3] dapat diakses dengan menggunakan *((int*) A + 23). Secara umum, untuk sebuah array ganda A berukuran mxn, pengaksesan elemen A[i][j] dapat dilakukan dengan menggunakan: *((tipe data*) A + (i*m + j)) dengan asumsi j<= n. Perhatikan contoh di bawah ini: int main() { int a[2][3]; int c, i, j; c = 0; for(i=0; i<2; i++) for(j=0;j<3;j++) a[i][j] = c++; //printf("%d", c); for(i=0; i<2; i++) for(j=0;j<3;j++) printf("%d, ", *((int*)a + (3*i + j))); 2
Bab 9 Lembar Kerja Praktikum Nama : Tanggal Praktikum : NRP : Waktu Praktikum : Nilai : Nama Asisten : Penjelasan Asisten (30 menit) Asisten akan menjelaskan mengenai definisi pointer. konsep dan kegunaan pointer, hubungan pointer dan array, serta pointer sebagai argumen fungsi. Lembar Kerja Bagian I (45 menit) Tuliskan program-program berikut, simpan nama file sesuai dengan nama yang sudah ditentukan pada folder (nama folder sesuaikan dengan NRP), kemudian jawablah pertanyaan singkat terkait dengan program tersebut pada tempat yang telah disediakan. Gambarkan alokasi memori dan perubahan masing-masing variabel pada kotak di sebelah kanan program. Dilarang menggunakan getch() dan system(pause) di dalam program. Gunakan command prompt untuk melakukan kompilasi dan menjalankan program. Program 1 Program 1 Nama Program: pointer1.c Perubahan variabel int main() x { int x = 3, y = 4; y int *z; z z = &x; y = *z; x = 10; *z = 3; printf( x = %d, y = %d, x, y); Apakah output yang dicetak program di atas? Statement apa yang harus ditambahkan agar program dapat mencetak isi dari variabel z dan mencetak isi memori yang ditunjuknya? 3
Program 2 Program 2 Nama Program: pointer2.c Perubahan variabel int main() { x int a=4, b=10, *x, *y; x = &b; y *x = 20; a y = x; x = &a; b *x = a; b = *x / 2 * 4 + *y; printf("a = %d, b = %d, *x = %d, *y = %d\n",a,b,*x,*y); Apakah output program? Jika pada program di atas sebelum printf ditambahkan statement a=x+y, apa yang terjadi? Program 3 Program 3 Nama Program: pointer3.c Hasil trace main() { int i; int a[5]={10,20,30,40,50; int *b=&a[1]; for (i=0; i<3; i++) { printf("%d ", b[0]); b++; Apa output program tersebut? Tuliskan proses untuk mendapatkan output tersebut pada kotak di sebelah kanan program. 4
Program 4 Nama Program: pointer4.c int what(int *a, int b) { int t=*a; *a=b; b=t; return (*a+b); main() { int a=5, b=10, c; printf("%d %d %d\n", a, b, what(&a,b)); Apa yang dilakukan program di atas, dan apakah outputnya? Program 5 Nama Program: pointer5.c #define SIZE 5 main() { chara[][size]={{'a','y','o',{'t','e','b','a','k',{'h','u','r','u','f'; char *p = &a[0][0]; char *q = a[2]; char *r = a[1]; printf("%c",*(r + SIZE)); printf("%c", *(p + SIZE + 1) ); printf("%c", p[2 * SIZE + 2]); printf("%c", p[2 * SIZE + 1] ); printf("%c", *(q - (SIZE + 3)) ); printf("%c", *r ); printf("%c", *r ); printf("%c", *(r - 3)); Apakah output dari program di atas? Dari program di atas, dapatkah Anda menyebutkan beberapa cara dalam mengakses elemen array? 5
Lembar Kerja Bagian II (45 menit) Buatlah program sesuai dengan instruksi yang diberikan simpan nama file sesuai dengan yang tertera pada soal di dalam folder NRP Anda. Tugas 10 Nama Program: tugas10.c Buatlah sebuah program untuk mencari berapa jumlah bilangan (dari n bilangan) yang nilainya di atas rata-rata n bilangan tersebut. Gunakan array untuk melakukan penyimpanan dan pointer untuk mengakses array tersebut 6