20
LKP 9 Pointer dan Fungsi A. Pointer Pendeklarasian pointer A dan B adalah 2 orang mahasiswa yang baru kenalan. Meski baru kenalan, A sudah berani meminjam uang ke B. Pengalaman B bahwa kalau hanya tahu no HP A saja, maka akan susah menagih hutang. Maka B meminta alamat rumah A agar bisa mengakses rumahnya jika hendak menagih hutang. Moral dari cerita ini adalah jika kita tahu alamat dari suatu variabel, kita bisa mendapatkan akses yang lebih. Dalam bahasa C, alamat memori tersebut bisa disimpan dalam variabel khusus bernama pointer, yaitu variabel yang menyimpan alamat. 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 (*). Contoh: 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 mendapat kan alamat memori dari sebuah variabel, digunakan tanda apostrophe (&). Contoh: int *p; int x = 5; p = &x; Pointer nul

LKP 9

Embed Size (px)

DESCRIPTION

lkp 9

Citation preview

Page 1: LKP 9

LKP 9Pointer dan Fungsi

A. Pointer

Pendeklarasian pointer

A dan B adalah 2 orang mahasiswa yang baru kenalan. Meski baru kenalan, A sudah berani meminjam uang ke B. Pengalaman B bahwa kalau hanya tahu no HP A saja, maka akan susah menagih hutang. Maka B meminta alamat rumah A agar bisa mengakses rumahnya jika hendak menagih hutang.

Moral dari cerita ini adalah jika kita tahu alamat dari suatu variabel, kita bisa mendapatkan akses yang lebih. Dalam bahasa C, alamat memori tersebut bisa disimpan dalam variabel khusus bernama pointer, yaitu variabel yang menyimpan alamat.

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 (*).

Contoh: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 mendapat kan alamat memori dari sebuah variabel, digunakan tanda apostrophe (&).

Contoh:int *p; int x = 5; p = &x;

Pada contoh di atas, p sekarang berisi nilai alamat memori dari x.

Nama Variabel Nilai Alamat

X 5 0x1001

Kita dapat menampilkan nilai alamat memori ini dengan menggunakan fungsi pustaka printf() dengan format %p.

Contoh:

p=&x p menyimpan alamat x

Pointer p

Pointer p

null

Page 2: LKP 9

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.

Contoh:printf(“%d”, *p) ;

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.

Contoh:int array[5]; int *p;p = &array[0]; /* pointer menyimpan alamat elemen pertama array */

elemen Nilai Alamat

array[0] 5 0x1001

array[1]

…..

2

….

0x1002

array[4] 6 0x1005

Lebih lanjut, setiap elemen dari array tersebut dapat diakses dengan menggunakan pointer yang telah ditunjuk dengan cara menambahkan indeks yang diinginkan ke pointer.

Contoh:printf(“%d”, *(p+2)) /*Sama 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.

Contoh :printf(“%d”, p+2) /*Sama dengan printf(“%d”, &array[2]); mencetak alamat dari array[2] */

p berisi 0x1001

Pointer p

Page 3: LKP 9

Untuk suatu array dua dimensi, secara umum penggambaran pointer hampir sama dengan array satu dimensi. Karena array 2 dimensi juga menempati alamat memori yang berurutan. Sebagai contoh, untuk suatu array berukuran 2x2 sbb

int array[2][2]={5,2,6,4};int *p;p=&array[0][0];

Elemen Nilai Alamat

array[0][0] 5 0x1001

array[0][1] 2 0x1002

array[1][0] 6 0x1003

array[1][1] 4 0x1004

printf("%d", *(p+1)); //cetak 2printf("%d", array[0][1]); //cetak 2

printf("%d",p+1); //cetak alamat elemen array[0][1]printf("%d",&array[0][1]); //cetak alamat elemen array[0][1]

Pointer sebagai Parameter Fungsi (Call by reference)

Variabel pointer dapat digunakan sebagai parameter fungsi. Dalam hal ini, yang diberikan ke fungsi adalah alamat. Jika dalam fungsi tersebut mengubah isi dari alamat yang diberikan, maka jika alamat tersebut diakses di bagian lain dari program, maka yang didapatkan adalah isi paling update dari alamat tsb.Contoh :

#include<stdio.h> void jumlah(int *q, int y ){ *q += y;

}

int main(){ int *p;

int x=5;

p=&x;

p berisi 0x1001

Pointer p

Page 4: LKP 9

jumlah(p, 2);

printf(“%d”, x); //cetak 7

return 0;}

Pada program di atas, fungsi main memanggil fungsi jumlah dengan mengirimkan alamat dari variabel x, yaitu variabel pointer p. Di fungsi jumlah, isi dari alamat yang diberikan kemudian ditambah dengan 2. Tanpa harus mengembalikan nilai ke variabel x, isi dari x otomatis akan berubah.

B. Fungsi

Fungsi adalah sub-program. Penggunaan fungsi dimaksudkan untuk memecah suatu program yang panjang menjadi beberapa bagian sub-program/fungsi dan masing-masing diberi nama. Selama ini kita sudah menggunakan fungsi, yaitu fungsi main. Fungsi main adalah fungsi yang pertama kali dijalankan oleh compiler. Fungsi main kemudian dapat digunakan untuk memanggil fungsi-fungsi lain yang sudah dideklarasikan di atasnya. Berikut ini adalah contoh program yang terdiri dari 2 fungsi, fungsi main dan fungsi Hello.

#include<stdio.h> void Hello(){   printf("Haiiii..\n");} int main(){   Hello();   return 0;}

Parameter dan Return

Fungsi hello di atas tidak memproses suatu parameter dan tidak memiliki kembalian (void). Suatu fungsi dapat menerima parameter untuk diproses dan mengembalikan hasil pemrosesan fungsi (return). Berikut ini adalah contoh fungsi jumlah yang menerima

Page 5: LKP 9

parameter 2 bilangan bertipe float dan double, serta mengembalikan hasil penjumlahannya dalam bentuk integer.

#include<stdio.h> int jumlah(float x, double y ){ int z;

z = x+y;

return z;} int main(){   int a; float b=5; double c=6;

   a= jumlah (b, c);

printf(“%d”, a);

return 0;}

Perhatikan bahwa dalam memanggil fungsi, data yang diberikan ke fungsi sebagai parameter harus sesuai tipe-nya dengan deklarasi parameter fungsi. Pada fungsi jumlah di atas menerima 2 parameter, bilangan pertama bertipe float, bilangan kedua bertipe double. Sehingga dalam memanggil fungsi tersebut, urutan parameter juga harus sesuai, yaitu float kemudian double. Data kembalian fungsi juga harus diterima oleh variable dengan tipe yang sesuai yaitu integer.

a= jumlah (b, c); // memanggil fungsi jumlah dengan mengirimkan parameter b bertipe float dan c bertipe double, kemudian menerima hasil return dan ditampung sebagai variabel a bertipe integer.

Deklarasi Fungsi

Suatu fungsi harus dideklarasikan dahulu sebelum digunakan. Deklarasi fungsi dapat dinyatakan dengan 2 cara, dengan menyertakan isi fungsi lengkapnya ataupun hanya function prototype dengan fungsi lengkapnya ditulis di bagian lain (tak harus sebelum pemanggilan fungsi). Berikut ini contoh 2 macam deklarasi fungsi.

#include<stdio.h> int jumlah(int x, int y ){ return x+y;}

#include<stdio.h>

int jumlah(int,int);//func prototype

Page 6: LKP 9

int main(){ printf(“%d”, jumlah(5,6));

return 0;}

int main()

{

printf(“%d”, jumlah(5,6));

return 0;

}

int jumlah(int x, int y )

{

return x+y;

}

Function prototype dapat ditulis dengan beberapa alternatif sbb :int jumlah(int x, int y );int jumlah(int, int );

Variabel global dan variabel lokal

Variabel global adalah variabel yang bisa diakses oleh semua fungsi dan dideklarasikan di luar fungsi. Sedangkan variabel lokal dideklarasikan di dalam suatu fungsi dan hanya bisa diakses hanya di dalam fungsi tersebut.

Contoh variabel global

#include<stdio.h> 

int a=5, b=6; //a dan b variabel global, bisa diakses semua fungsi

int jumlah() // tanpa parameter { return a+b; // a dan b sudah diketahui krn bisa diakses

}

Page 7: LKP 9

int main(){ printf(“%d”, jumlah());

return 0;}

Contoh variabel lokal : a, b, z

#include<stdio.h>int jumlah(int x, int y)

{

int z; //z variabel lokal karena dideklarasikan di dalam fungsi

z=x+y; // z hanya bisa diakses di dalam fungsi jumlah saja

return z;

}

int main(){ int a=5, b=6; //a dan b variabel lokal, hanya bisa diakses di main

printf(“%d”, jumlah(a, b));

return 0;}

Page 8: LKP 9

2

Page 9: LKP 9

Bab 9Lembar Kerja Praktikum

Nama : Tanggal Praktikum :

NRP : Waktu Praktikum :

Nilai : Nama Asisten :

Penjelasan AsistenAsisten akan menjelaskan mengenai definisi pointer. konsep dan kegunaan

pointer, hubungan pointer dan array, serta pointer sebagai argumen fungsi. Jika masih ada waktu asisten menjelaskan kembali tentang fungsi.

Lembar Kerja Bagian I (45 menit)Tuliskan program-program berikut, simpan nama file sesuai dengan nama yang

sudah ditentukan pada folder, 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.

Program 1 Program 1Nama Program: pointer1.c Perubahan variabel#include <stdio.h>int main() x{

yint x = 3, y = 4;int *z;

zz = &x;y = *z;x = 10;*z = 3;printf(“x = %d, y = %d”,x, y);return 0;}

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?Jawab:________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Page 10: LKP 9

3

Page 11: LKP 9

Program 2 Program 2Nama Program: pointer2.c Perubahan variabel#include <stdio.h>int main(){ xint a=4, b=10, *x, *y;

yx = &b;*x = 20; ay = x;

bx = &a;*x = a;b = *x / 2 * 4 + *y;printf("a = %d, b = %d, *x = %d,*y = %d\n",a,b,*x,*y);return 0;}

Apakah output program? Jika pada program di atas sebelum printf ditambahkan statement a=x+y, apa yang terjadi?Jawab:________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Program 3 Program 3Nama Program: pointer3.c Hasil trace#include <stdio.h>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++;}

return 0;}

Apa output program tersebut? Tuliskan proses untuk mendapatkan output tersebut pada kotak di sebelah kanan program.Jawab:________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

4

Page 12: LKP 9

________________________________________________________________________

Program 4Nama Program: pointer4.c#include <stdio.h>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)); return 0;

}

Apa yang dilakukan program di atas, dan apakah outputnya? Jawab:________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Program 5Nama Program: pointer5.c#include <stdio.h> #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)); return 0;}

Apakah output dari program di atas? Dari program di atas, dapatkah Anda menyebutkan beberapa cara dalam mengakses elemen array?Jawab:________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Page 13: LKP 9

5

Page 14: LKP 9

________________________________________________________________________________________________________________________________________________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 10Nama Program: tugas10.cBuatlah 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

Page 15: LKP 9

6