Algoritma dan Struktur Data Pointer Pada Struct
REVIEW POINTER
Memori Komputer • Komputer menyimpan variabel program di satu atau beberapa slot pada memori • Tiap slot memori memiliki nomor atau alamat tertentu
Di slot memori nomer berapa sebuah variabel disimpan ? #include <stdio.h> #include
void main() { int x; x = 10; printf("x berada di slot memori nomor : %d", &x); getch(); }
Eksekusi program
Pointer • Nomor atau alamat slot memori di mana variabel disimpan dapat disimpan pada variabel lain • Variabel tersebut dinamakan pointer • Pointer tidak menyimpan isi variabel, tetapi menyimpan alamat / nomor slot di mana isi variabel berada
Pointer • Pointer adalah variabel yang menyimpan alamat dari variabel yang lainnya. • Deklarasi pointer : *ptr_name; • Dua operator yang sering digunakan pada pointer : * (content of) dan & (address of). • Contoh Inisialisasi sebuah integer pointer ke data variable: int i, *ptr; ptr = &i;
Untuk merubah isi/nilai yg ditunjuk oleh pointer: *ptr = 5; /* sama artinya dgn i=5 */
8
Contoh #include <stdio.h> #include void main() {
int x; int *px; x = 10; px = &x; printf("x berada di slot memori nomor : %d", px); getch(); }
Eksekusi program
Mengakses nilai variabel
• Nilai sebuah variabel bisa diakses melalui dua cara Cara 1 : Langsung Cara 2 : Menggunakan pointer
Contoh #include <stdio.h> #include void main() {
int x; int *px; x = 10; px = &x; printf("nilai x diakses secara langsung : %d\n", x); printf("nilai x diakses melalui pointer : %d", *px); getch(); }
Eksekusi program
An Illustration int i = 5, j = 10; int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7;
Data Table Name
Type
ptr = &j;
i
int
integer variable
5
**pptr = 9;
j
int
integer variable
10
*pptr = &i; *ptr = -2;
Description
Value
An Illustration int i = 5, j = 10; int *ptr;
/* declare a pointer-to-integer variable */
int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7;
Data Table Name
Type
ptr = &j;
i
int
integer variable
5
**pptr = 9;
j
int
integer variable
10
*pptr = &i;
ptr
int *
*ptr = -2;
Description
integer pointer variable
Value
An Illustration int i = 5, j = 10; int *ptr; int **pptr;
/* declare a pointer-to-pointer-to-integer variable */
ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7;
Data Table Name
Type
Description
ptr = &j;
i
int
integer variable
5
**pptr = 9;
j
int
integer variable
10
*pptr = &i;
ptr
int *
integer pointer variable
*ptr = -2;
pptr
int **
integer pointer pointer variable Double
Value
An Illustration int i = 5, j = 10; int *ptr; int **pptr; ptr = &i;
/* store address-of i to ptr */
pptr = &ptr; *ptr = 3; **pptr = 7;
Data Table Name
Type
Description
ptr = &j;
i
int
integer variable
5
**pptr = 9;
j
int
integer variable
10
*pptr = &i;
ptr
int *
integer pointer variable
*ptr = -2;
pptr
int **
integer pointer pointer variable
*ptr
int
de-reference of ptr
Value
address of i 5
An Illustration int i = 5, j = 10; int *ptr; int **pptr; ptr = &i; pptr = &ptr; /* store address-of ptr to pptr */ *ptr = 3; **pptr = 7;
Data Table Name
Type
Description
Value
ptr = &j;
i
int
integer variable
5
**pptr = 9;
j
int
integer variable
10
*pptr = &i;
ptr
int *
integer pointer variable
*ptr = -2;
pptr
int **
integer pointer pointer variable
address of ptr
*pptr
int *
de-reference of pptr
value of ptr (address of i)
address of i
An Illustration int i = 5, j = 10; int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7;
Data Table Name
Type
Description
ptr = &j;
i
int
integer variable
3
**pptr = 9;
j
int
integer variable
10
*pptr = &i;
ptr
int *
integer pointer variable
*ptr = -2;
pptr
int **
integer pointer pointer variable
*ptr
int
de-reference of ptr
Value
address of i
address of ptr 3
An Illustration int i = 5, j = 10; int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7;
Data Table Name
Type
Description
Value
ptr = &j;
i
int
integer variable
7
**pptr = 9;
j
int
integer variable
10
*pptr = &i;
ptr
int *
integer pointer variable
*ptr = -2;
pptr
int **
integer pointer pointer variable
address of ptr
**pptr
int
de-reference of de-reference of pptr
7
address of i
An Illustration int i = 5, j = 10; int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7;
Data Table Name
Type
Description
ptr = &j;
i
int
integer variable
7
**pptr = 9;
j
int
integer variable
10
*pptr = &i;
ptr
int *
integer pointer variable
*ptr = -2;
pptr
int **
integer pointer pointer variable
*ptr
int
de-reference of ptr
Value
address of j
address of ptr 10
An Illustration int i = 5, j = 10; int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7;
Data Table Name
Type
Description
Value
ptr = &j;
i
int
integer variable
7
**pptr = 9;
j
int
integer variable
9
*pptr = &i;
ptr
int *
integer pointer variable
*ptr = -2;
pptr
int **
integer pointer pointer variable
address of ptr
**pptr
int
de-reference of de-reference of pptr
9
address of j
An Illustration int i = 5, j = 10; int *ptr; int **pptr; ptr = &i; pptr = &ptr; *ptr = 3; **pptr = 7;
Data Table Name
Type
Description
ptr = &j;
i
int
integer variable
-2
**pptr = 9;
j
int
integer variable
9
*pptr = &i;
ptr
int *
integer pointer variable
*ptr = -2;
pptr
int **
integer pointer pointer variable
*ptr
int
de-reference of ptr
Value
address of i
address of ptr -2
• Pointer to pointer adalah variabel yang menyimpan alamat dari pointer yang lainnya. • Deklarasi pointer : **ptr_ptr ; • Contoh int i, *ptr, **ptr_ptr ; ptr = &i; ptr_ptr = &ptr;
Untuk merubah nilai variabel i bisa melalui sbb: *ptr = 5; // sama artinya dgn i=5 ; **ptr_ptr = 9; //sama artinya dgn i=9; atau *ptr=9; 24
25
Operasi pada pointer • Apa arti ptr + 1?
Alamat slot sesudahnya! • Apa arti ptr - 1? Alamat slot sebelumnya! • Apa arti ptr * 2 and ptr / 2? Invalid operations!!!
Operasi pada pointer • Apa arti *ptr + 1
? • Apa arti *ptr - 1 ? • Apa arti *ptr * 2 and ptr / 2 ?
REVIEW Pass by Value & Pass by Reference
Program tanpa fungsi 1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include <stdio.h> #include void main(){ float panjang, lebar, luas; panjang = 10; lebar = 20 luas = panjang * lebar; printf ("Luas persegi = %f\n", luas ); getch(); }
Perhitungan luas diletakkan di bagian terpisah 1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include <stdio.h> #include void main(){ float panjang, lebar, luas; panjang = 10; lebar = 20
luas = hitungluas(panjang, lebar); printf ("Luas persegi Anda = %f\n", luas ); getch(); }
Fungsi untuk menghitung luas 1 2 3 4 5 6
float hitungluas(float p, l){ float l; l = p * l; return(l); }
Program menggunakan fungsi 1 2 3 4 5 6 7 8 9 10 11 12 13
void main(){ float panjang, lebar, luas; ….. luas = hitungluas(panjang, lebar); …. } float hitungluas(float p, float l){ float lu; lu = p * l; return(l); }
Latihan • Variabel atau data untuk main dan hitungluas terletak di bagian memori berbeda • Keduanya tidak berhubungan • Gambarkan keadaan memori untuk main dan hitungluas!
Pass by Value • Jika kita mengubah nilai variabel p di hitungluas, apakah variabel panjang di main nilainya berubah?
Pass by Value 1 2 3 4 5 6 7
float hitungluas(float p, l){ float lu; lu = p * l; p = p * 2; return(lu); }
Pass by Value • Pada saat main memanggil fungsi hitungluas, isi variabel panjang dan lebar dicopy kemudian dikirim ke hitungluas • Di fungsi hitungluas, nilai tersebut dimasukkan ke variabel p dan l • Merubah nilai p dan l tidak berakibat apa-apa pada variabel panjang dan luas • Ingat, variabel main dan hitungluas terletak di bagian memori yang berbeda!
Pass by Reference • Bagaimana cara mengubah nilai variabel panjang pada main dari fungsi hitungluas? • Pada saat memanggil hitungluas, jangan mengirim nilai panjang • Kirim alamat variabel panjang ke hitung luas • Hitungluas dapat mengakses & mengubah isi variabel panjang milik main secara indirect
Program menggunakan fungsi 1 2 3 4 5 6 7 8 9 10 11 12 13
void main(){ float panjang, lebar, luas; ….. luas = hitungluas(&panjang, lebar); …. } float hitungluas(float *p, float l){ float lu; lu = (*p) * l; *p = (*p) * 2; return(l); }
Pass by Reference • Variabel v ada di fungsi F • F memanggil fungsi G • G perlu mengubah nilai v di F • • • •
Jangan mengirim nilai v ke G Kirim alamat v G dapat mengakses v di F secara indirect G dapat mengubah nilai v di F
Latihan • Buatlah fungsi untuk menukar isi dua variabel bertipe float!
Solusi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#include <stdio.h> #include void tukar(float *x, float *y); void main(){ float bil1, bil2; bil1 = 10; bil2 = 15;
printf ("Bilangan 1 = %f , bilangan 2 = %f\n", bil1, bil2 ); tukar(&bil1, &bil2); printf ("Bilangan 1 = %f , bilangan 2 = %f\n", bil1, bil2 ); getch(); } void tukar(float *x, float *y){ float temp; temp = *x; *x = *y; *y = temp;
}
Using a Pass by Value • Is like giving someone the key to your home
• The key can be used by the other person to change the contents of your home!
Additional Terms • Pass-by-reference is also called . . . – pass-by-address, or – pass-by-location
Can you explain why?
• Contoh : Pengiriman parameter by location #include <stdio.h> void Hitung (int X, int Y, int *P, int *Q) { *P = X + Y; *Q = X * Y; x=0; y=1; printf(“Dalam Fungsi Hitung nilai X: %d ,\n Nilai Y: %d”, X,Y); } void main() { int X, Y, PA, QA; /*local variabel*/ printf(“ X=”); scanf(“%d”,&X); printf(“ Y=”); scanf(“%d”,&Y); Hitung(X,Y,&PA,&QA); printf(“Dalam Fungsi Main nilai X: %d ,\n Nilai Y: %d”, X,Y); printf(”Nilai PA= %d\n”, PA); printf(”Nilai QA= %d\n”, QA); }
44
User defined data type Berisi beberapa variabel yang bisa berbeda tipenya masing-masing disebut elemen yang dikelompokkan menjadi satu dengan sebuah nama baru Mirip representasi sebuah object beserta properties-nya. Contoh: struct MHS setidaknya punya elemen untuk NPM, Nama dan Alamat. 46
Syntax: struct nama_struct { tipe_data_1 nama_var_1; tipe_data_2 nama_var_2; tipe_data_3 nama_var_3; …… };
47
struct • Penting untuk implementasi ADT / membuat tipe data baru • E.g., struct motor { float volts; //voltage of the motor float amps; //amperage of the motor int phases; //# of phases of the motor float rpm; //rotational speed of motor }; typedef struct motor motor;
struct • E.g., struct motor { float volts; float amps; int phases; float rpm; }; typedef struct motor motor;
struct • E.g., struct motor { float volts; Members of the float amps; struct int phases; float rpm; }; typedef struct motor motor;
struct • Mendefinisikan tipe data baru • E.g., struct motor { float volts; float amps; int phases; float rpm; }; typedef struct motor motor;
Menggunakan tipe data baru motor p, q, r; • Mendefinisikan tiga variable – p, q, dan r – masing masing bertipe data motor
motor M[25]; • Mendeklarasikan array M berisi 25 data bertipe motor
motor *m; • Mendeklarasikan variabel pointer yang menyimpan alamat slot memori yang berisi data bertipe motor
Mengakses anggota struct • Deklarasi motor p; motor q[10];
Syntax: nama_var_struct . nama_var_elemen;
• Maka p.volts p.amps p.phases p.rpm
— is the voltage — is the amperage — is the number of phases — is the rotational speed
q[i].volts q[i].rpm
— is the voltage of the ith motor — is the speed of the ith motor
• Sebuah kondisi dimana di dalam sebuah struct terdapat tipe data berupa struct lagi.
54
• Contoh:
55
• Sebuah struct yang di dalamnya terdapat variable/ elemen yang bertipe array. Contoh: struct data { char kode [10]; char nama [20]; char alamat [30]; ……… }
56
• Sebuah array yang setiap data elemennya bertipe struct. Umumnya dipakai untuk menyimpan object data yang terstruktur, misal: data mahasiswa, karyawan, buku, barang, dsb.
57
58
Mengakses elemen struct menggunakan pointer • Deklarasi motor *p;
• Maka — is the voltage of the motor pointed to by p (*p).phases — is the number of phases of the motor pointed to by p (*p).volts
Mengakses elemen struct menggunakan pointer • Notasi (*p).member kurang nyaman dipakai • Cara yang lebih singkat – p->member, di mana p merupakan variabel
pointer
Contoh sebelumnya menjadi … • Deklarasi motor *p;
• Maka — is the voltage of the motor pointed to by p p -> phases — is the number of phases of the motor pointed to by p p -> volts
contoh struct motor { float volts; float amps; }; typedef struct motor motor; void main() { motor m1; motor *pm1; m1.volts = 100; m1.amps = 110; pm1 = &m1;
printf("voltase motor m1 : %f\n", m1.volts); printf("amps motor m1 : %f\n", m1.amps); printf("voltase motor m1 : %f\n", pm1->volts); printf("amps motor m1 : %f", pm1->amps); getch(); }
Hasil eksekusi program
Operasi pada struct • Copy/assign struct motor p, q; p = q;
• Get address struct motor p; struct motor *s s = &p;
• Access members p.volts; s -> amps;
Example struct item { char *s; struct item *next; }
• • • •
Sebuah item dapat berisi alamat item lain… … yang dapat menunjuk item lain … yang juga dapat menunjuk item yang lain lagi … etc.
Dengan demikian membentuk rangkaian item!!!