Anda di halaman 1dari 35

POINTER

PRAKTIKUM STRUKTUR DATA


2021
Apa itu pointer???
Pointer adalah penunjuk suatu variabel. Karena menunjuk suatu
variabel, maka pointer wajib memiliki alamat dari variabel yang
ditunjuknya. Dengan syarat tipe datanya harus sama .

Misal :
Ada suatu variable A berisi alamat dari variable B, maka variable A
dapat dikatakan menunjuk variable B.
OPERATOR POINTER
Menunjukkan
nilai pada suatu
alamat

& *
Menunjukkan
alamat dalam
suatu memori
Hmmm …
Apa bedanya pointer dengan variable biasa??
Pointer Variabel Biasa
Deklarasi Variabel Int *a; Int b;
Alamat Memori Tidak Otomatis Otomatis
Mengetahui alamat memori a &b
Mengetahui data atau *a b
nilainya
Mengapa pakai pointer?? Alamat itu
dinamis
Perhatikan ilustrasi dibawah ini :

a=5
Alamat 1 Alamat 2 Alamat 3 Alamat 4 Alamat 5 Alamat n
Misal

Misal kita punya : Saat variable a dideklarasikan maka


Int a = 5 ; akan menepati atau mengakses suatu
Cout<< a <<endl; memori . Misal a menepati alamat 1.
Sekarang kita tambahkan fungsi untuk Alamat itu
memberi nilai dengan parameter masukan dinamis

a=5 b
Alamat 1 Alamat 2 Alamat 3 Alamat 4 Alamat 5 Alamat n
Misal

Pada int main : Pada fungsi : Saat parameter a pada int main dikirim ke
fungsi maka variable b membutuhkan space
Int a = 5 ; Fungsi ( int b ) { baru untuk mealokasikan nilai yang
diterimanya dari int main.
Cout<< a <<endl; Cout<<b<<endl;
Fungsi(a); } Hal itu menjadi tidak efisien.
Gimana solusinya? Next --
Solusi : Kita ubah parameter masukan pada Alamat itu
fungsi menjadi variable pointer dinamis

a=5
Alamat 1 Alamat 2 Alamat 3 Alamat 4 Alamat 5 Alamat n
Misal
Jika menggunakan variable pointer pada
fungsi maka saat masukan a pada int main
berbentuk alamat yaitu dengan sintak &a
Pada int main : Pada fungsi : yang nantinya dikirim ke fungsi berupa
Int a = 5 ; Fungsi ( int *b ) { alamat.
Cout<< a <<endl; Cout<<b<<endl; Sehingga pada saat parameter diterima
Fungsi(&a); } oleh fungsi variable pointer b, maka pointer
b bisa mengakses nilai a dengan hanya
menunjuk alamat a.
Deklarasi Pointer
Sama seperti variable yang lain, variable pointer juga harus
dideklarasikan terlebih dahulu sebelum digunakan.

Bentuk umum : Tipe_data*nama_pointer;

Contoh :
Int *nilai;
Char*huruf;
Cara untuk alokasi space memori bagi pointer .

Yaitu dengan menepati space variable lain yang sudah punya space.
Variabel lain dapat berupa variable biasa maupun pointer yang tentunya sudah punya alkasi space
memori.

Sintak : var_pointer = &var biasa.

Contoh : Hmm kok bisa


Int data = 50;
gitu?
Int *p;
P = &data;
Jika kita outputkan
Cout <<*p<<endl;
Outputnya = 50
Next untuk ilustrasinya
Memory

*p data P mengakses nilai


pada variable data
50

=> alamat

1. p=&data 2. Output :
Artinya p menunjuk alamat Cout<<*p<<endl; //50
varibel data Maka p mengarah pada nilai alamat yang
ditunjuknya.
Dari slide sebelumnya, kita coba untuk mengganti nilai pada variable data
menggunakan pointer (*p=100; )

Int data = 50; Nilai pada variable data terganti karena


Int *p; sebelumnya alamat data telah ditunjuk oleh
pointer p ( p =&data ) sehingga pada saat
P = &data; pointer p memiliki nilai tersendiri maka akan
*p=100; mengubah nilai pada variable data. karena suatu
Jika kita outputkan pointer menunjuk suatu alamat variable maka
pointer dapat mengganti/mengubah nilai pada
Cout <<data<<endl; variable yang alamatnya ditunjuk pointer
Outputnya = 100 tersebut.
*p
Contoh lagi : 25
Misal ada 2 pointer .
P=q
*p=25 *q
*q=10
Lalu ada statement : 10
P=q
Maka jika kita outputkan :
Cout<<p<<endl; Maksud p=q adalah nilai pointer p bergantung
pada nilai yang ditunjuk pointer q.
Outputnya : p = 10;
Contoh lagi :
#include <iostream>
using namespace std;
int main () {
int x , *y;
y=&x;
x=7;
*y=13;
cout<<"Nilai X = "<<x<<endl;
cout<<"Alamat memori x = " <<&x<<endl;
cout<<"Nilai Y = "<<*y<<endl;
cout<<"Alamat memori y =" <<y<<endl;
}
Coba tebak outputnya …..
#include <iostream>
using namespace std;
Int main (){
int n1,n2;
int *p;
p=&n1;
*p=10;
p=&n2;
*p=60;
cout<<"Nilai n1 = "<<n1;
cout<<"\nNilai n2 = "<<n2; Dicoba dulu di cari outputnya
cout<<"\nNilai p = "<<*p; } baru di next
Apakah hasil output yang kalian coba sama dengan hasil ouput
dibawah??

Kalau jawaban output kalian belum sesuai di pahami ulang lagi ya slide sebelumnya 
Contoh salah dalam pemakaian pointer :
#include <iostream> using namespace std;

int main() {
double *p;
float q;
int r= 1234;
Sebab p adalah pointer double padahal r bertipe int
P= &q; ( SALAH )
int q = *p; ( SALAH )
cout << “r = " << r << endl;
cout << “q= " << q << endl;
}
POINTER ARITHMETIC
Ada 2 operator aritmatika , pertambahan dan pengurangan yang
memungkinkan di gunakan dalam pointer. Jadi ketika kita
menambahkan 1 ke sebuah pointer, maka kita sebenarnya
menambahkan size tipe datanya dalam bytes , diamana pointer itu
menunjuk.
Contoh : cout<<*x; cout<<endl; cout<<endl;
int y=100; cout<<endl; x++; cout<<*x;
int *x=&y; cout<<x; cout<<x;

Jika alamat dari x sebelumnya 100, lalu terdapat statement x++ maka
statement tersebut akan menambahkan x dengan 4 ( ukuran tipe data
int 4 bytes ).
Pointer to an Array
Dua struktur data yang saling berkaitan satu sama lain didalam C++, dan dapat saling
dipertukarkan penggunaannya. Hal ini karena suatu array dapat didefinisikan sebagai
pointer ke elemen pertama dari array tersebut.

Contoh :
Terdapat sebuah array simpan dari pointer sebanyak 7 buah data yang bertipe integer,
maka kita dapat tulis sebagai berikut :
Int *simpan[7];

Untuk menentukan alamat dari variabel integer disebut var ke elemen kempat dari
pointer array, dapat dituliskan sebagai berikut :
Int var;
Simpan[3]=&var;
Contoh :
#include <iostream> Output :
using namespace std;
main (){
int arr[5] ={1,2,3,4,5};
Jadi jika kita cout kan ptr saja maka
int *ptr=arr;
pointer ptr akan mengandung basis
cout<<"ptr = " <<ptr<<endl; alamat dari variable arr .
cout<<"ptr = " <<&ptr[0]<<endl; Dan jika kita cout kan &ptr[0] maka
} itu secara detail menunjuk basis
alamat dari variable arr.
Lanjutan contoh ……
Output :

#include <iostream>
using namespace std;
main (){
int arr[5] ={1,2,3,4,5};
int *ptr=arr;
cout<<"Alamat dari &ptr+2 = " <<&ptr+2<<endl;
cout<<"Nilai pada *ptr+2 = "<<*ptr+2;
}
Pointer to String
Output :
Contoh :
#include <iostream>
using namespace std;
main (){
char str[] ="computer";
char *cp=str;
Pointer cp menyimpan alamat dari variable str.
//using variabel name
Statement cout<<cp;  akan mencetak
cout<<str<<endl; computer sebagai nilai dari alamat str.
//using pointer variabel
cout<<cp<<endl;
}
Contoh 2 : Output :
#include <iostream>
using namespace std;
main (){
char *kendaraan[]={"MOBIL","PESAWAT",
"MOTOR","KERETA","BUS"};
for (int i=0;i<5;i++)
cout<<kendaraan[i]<<endl; Array kendaraan[] adalah sebuah array yang
memiliki tipe char pointer. Kendaraan[0]
}
mengandung basis alamat dari string
“Car”,kendaraan[1] mengandung alamat dari
string “Pesawat”.
Double Pointer ( Pointer to Pointer **p )
Representasi double pointer : Dalam pointer to pointer terdapat hubungan
hieraki . Variabel Pointer to pointer tidak dapat
1. Int a = 50; langsung berhubungan dengan variable biasa
melainkan dijembatani oleh variable pointer
2. Int *p = &a dengan cara menunjuk alamat yang dituju secara
hierarki. Cermati representasi double pointer
3. Int **q =&p disamping!

**q *p a
50
Misal dari representasi sebelumnya kita beri alamat memori :

a *p **q
50 p=1000 q=2000

1000 2000 3000 -> alamat

Variabel a merupkan variable Poiter p adalah pointer yang Poiter q adalah pointer yang
yang di simpan/dialokasikan mengandung alamat dari mengandung alamat dari
pada alamat 1000. variable a. variable p pointer..
a *p **q
50 p=1000 q=2000

1000 2000 3000 -> alamat

Output :
Nilai dari **q = 50 Penjelasan **q :
Nilai dari *p = 50 - Pointer q akan memberi nilai pada lokasi alamat
Nilai dari a = 50 2000, yaitu 1000
- - poninter to pointer q akan memberi nilai pada lokasi
Nilai dari p = 1000 1000, yaitu 50.

Nilai dari q = 2000


Nilai dari &a = 1000
Contoh :
#include <iostream>
Var=789 Ptr2=1000 Ptr1=2000
using namespace std;
1000 2000 3000
main (){
int var = 789;
int *ptr2;
int **ptr1;
ptr2= &var;
ptr1=&ptr2; Output :
Var = 789
cout<<" Nilai dari var = " <<var<<endl; *ptr2 = 789
cout<<" Nilai dari var pada single pointer = " <<*ptr2<<endl; **ptr1 =789
cout<<" Nilai dari var pada double pointer= " <<**ptr1<<endl;
}
Pointer & fungsi
Pointer jika diimplementasikan pada fungsi sangat membantu dalam
efisiensi memori. Karena parameter yang masuk dalam fungsi itu
berupa dalam bentuk alamat yang menunjuk nilai masukan. Sehingga
pada saat masuk ke fungsi parameter tidak dialokasikan ke space
memori baru melaikan mengakses alamat yang dikirimkan melalui
parameter tadi.
Contoh menggunakan fungsi :
#include <iostream> Output :
#include <stdlib.h>
using namespace std;
void fungsi(int *b) {
cout<<"Address b : " <<b <<endl;
cout<<"Nilai b : "<<*b;
}
int main () { Addres pada variable a sama dengan addres pada
int a= 5; variable b . Hal itu meunjukan bahwa yang dikirim pada
parameter adalah alamat a yang mana nantinya akan
cout<<"address a : "<<&a<<endl; diakses nilai dalam variable a di int main tersebut
cout<<"Nilai a : "<<a<<endl; menggunakan pointer b.
fungsi (&a);
}
Coba bandingkan dengan tanpa menggunakan pointer :
Output :
#include <iostream>
#include <stdlib.h>
using namespace std;
void fungsi(int b) {
cout<<"Address b : " <<&b <<endl;
cout<<"Nilai b : "<<b;
}
int main () { Jika tanpa menggunakan pointer terlihat bahwa alamat
int a= 5; pada variable a dan variable b berbeda. Dikarenakan yang
cout<<"address a : "<<&a<<endl; dimasukkan dalam parameter fungsi merupakan nilai yang
cout<<"Nilai a : "<<a<<endl; mana saat dikirim ke fungsi parameter tersebut
dialokasikan ke space alamat baru. Jika kita punya program
fungsi (a); yang besar ini sangat memakan memori dan program
} menjadi tidak efisien.
No 1 TUGAS
main (){
int numbers[5]; Tulisakan hasil output dan jelaskan proses dalam
program tersebut sampai menghasilkan output!
int *p; ( Jelaskan pertahap alurnya dengan bahasa sendiri ,
p = numbers; boleh di komentar pada programnya )
*p = 10;
p++;
*p = 20;
p = &numbers[2];
*p = 30;
p = numbers + 3;
*p = 40;
p = numbers;
*(p+4) = 50;
for(int n=0;n<5;n++)
cout << numbers[n] << ", ";
}
No 2 Tugas
int add_array ( int *a,int no_element); Tulisakan hasil output dan jelaskan proses dalam
int main () { program tersebut sampai menghasilkan output!
int arr[5] ={50,45,50,20,10}; ( Jelaskan pertahap alurnya dengan bahasa sendiri ,
boleh di komentar pada programnya )
cout<<" Output : " <<add_array(arr,5);
return 0;
}
int add_array (int*p,int size ) {
int total =0 ;
int i;
for (i=0;i<size;i++){
total +=p[i];
}
return(total);
}
Tugas
No 3
Buatlah Program untuk menukar isi 3 string yang ditunjuk dengan
pointer .

nama 1  “Tikiwinky” nama 1  “Asep”


Nama 2 ”Lala” Menjadi Nama 2 ”Tikiwinky”
Nama 3 ”Lala”
Nama 3 ”Asep”
TUGAS
No 4
Buatlah program untuk membalikan kata dengan
mengimplementasikan pointer !
Contoh output :
Ketentuan & Format
Untuk soal no 1 & 2 kerjakan di word . Dengan format nama file :
P1&2_NIM_NAMA.docx
Untuk soal no 3 & 4 hasil dikirim dalam bentuk cpp. Dengan format nama file cpp :
P3&4_NIM_NAMA.cpp

Dikirim di spade dalam bentuk link drive. Tidak usah di zip atau rar.
Kerjakan sendiri ,jika ada pertanyaan silahkan tanyakan digroup .
Semangat 
Jaga kesehatan
SELAMAT MENGERJAKAN

Anda mungkin juga menyukai