Upload
sirius
View
50
Download
0
Embed Size (px)
DESCRIPTION
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. Tambahkan & sebelum variabel x. - PowerPoint PPT Presentation
Citation preview
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 <conio.h>
void main(){
int x;
x = 10; printf("x berada di slot memori nomor : %d", &x); getch();}
Tambahkan &
sebelum variabel x
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 : <type> *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 <conio.h>
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 caraCara 1 : LangsungCara 2 : Menggunakan pointer
Contoh
#include <stdio.h>#include <conio.h>
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;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 5
j int integer variable 10
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;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 5
j int integer variable 10
ptr int * integer pointer variable
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;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 5
j int integer variable 10
ptr int * integer pointer variable
pptr int ** integer pointer pointer variable
Double Indirection
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;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 5
j int integer variable 10
ptr int * integer pointer variable address of i
pptr int ** integer pointer pointer variable
*ptr int de-reference of ptr 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;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 5
j int integer variable 10
ptr int * integer pointer variable address of i
pptr int ** integer pointer pointer variable address of ptr
*pptr int * de-reference of pptr value of ptr
(address of i)
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 3
j int integer variable 10
ptr int * integer pointer variable address of i
pptr int ** integer pointer pointer variable address of ptr
*ptr int de-reference of ptr 3
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 7
j int integer variable 10
ptr int * integer pointer variable address of i
pptr int ** integer pointer pointer variable address of ptr
**pptr int de-reference of de-reference of pptr
7
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 7
j int integer variable 10
ptr int * integer pointer variable address of j
pptr int ** integer pointer pointer variable address of ptr
*ptr int de-reference of ptr 10
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 7
j int integer variable 9
ptr int * integer pointer variable address of j
pptr int ** integer pointer pointer variable address of ptr
**pptr int de-reference of de-reference of pptr
9
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable -2
j int integer variable 9
ptr int * integer pointer variable address of i
pptr int ** integer pointer pointer variable address of ptr
*ptr int de-reference of ptr -2
• Pointer to pointer adalah variabel yang menyimpan alamat dari pointer yang lainnya.
• Deklarasi pointer : <type> **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 fungsi1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <conio.h>
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 <conio.h>
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 fungsi1
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!
Solusi1
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 <conio.h>
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
44
#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);}
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;
Name of the type
struct
• E.g., struct motor {float volts;float amps;int phases;float rpm;
};
typedef struct motor motor;
Members of the struct
struct
• Mendefinisikan tipe data baru• E.g.,
struct motor {float volts;float amps;int phases;float rpm;
};typedef struct motor motor;
Agar pada saat deklarasi
variabel cukup dengan
memanggil motor saja
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];
• Makap.volts — is the voltagep.amps — is the amperagep.phases — is the number of phasesp.rpm — is the rotational speed
q[i].volts — is the voltage of the ith motorq[i].rpm — is the speed of the ith motor
Syntax:nama_var_struct . nama_var_elemen;
• 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.
56
Contoh:struct data {
char kode [10];char nama [20];char alamat [30];………
}
• 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
• Deklarasimotor *p;
• Maka(*p).volts — is the voltage of the motor pointed
to by p
(*p).phases — is the number of phases of the
motor pointed to by p
Mengapa memakai () ?
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 …
• Deklarasimotor *p;
• Makap -> volts — is the voltage of the motor pointed
to by p
p -> phases — is the number of phases of the
motor pointed to by p
contohstruct 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/assignstruct motor p, q;p = q;
• Get addressstruct motor p;struct motor *ss = &p;
• Access membersp.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!!!
Yes! This is
legal!