Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 1
Pertemuan 3
Konsep Pointer Dalam C
Disusun oleh :
PH. Prima Rosa, S.Si., M.Sc.
Sri Hartati Wijono, S.Si.
© 2003/2004
Konsep
Fungsi Mengembalikan Nilai
Argumen Fungsi
Arrays Sebagai Argumen
Scope
Pemanggilan Fungsi
Ekspresi Boolean
Statemen
if
Statemen
if-else
Statements
nested
if
Ekspresi Kondisi
Statemen
switch
PemakaianEkspresi Boolean
"Dangling Else"
Fungsi Pustaka String
Pointers
Operator Alamat
Mendeklarasikan Pointers
Pointers Lanjut
Pointers dan Arguments
Pointers dan Arrays
Aritmetic Pointer
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 3
Apa Itu Pointers ?
• Semua data disimpan dalam memori pada
alamat tertentu.
• Sebuah pointer dapat digunakan untuk
menyimpan sebuah alamat dari sebuah
data
• Nilai yang disimpan dalam sebuah
variabel dapat diubah dengan mengubah
data di dalam tempat yang ditunjuk oleh
pointer pada memori.
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 4
Apa Itu Pointers ?
• Analogi : Jalan Raya
5
123
0
Pengenal
Ruang memori tempat penyimpan nilai
Alamat
Rumah Sakit
Toko
Rumah
3221219956
3221219952
3221219948
Penun
juk To
ko
(32212
19952
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 5
• Bagaimana kita menemukan alamat
sebuah variabel dalam memori ?
– Menggunakan alamat operator
&
– Jangan dicampuradukkan dengan
operator boolean
&&
&DataInt
– Operator & diletakkan sebelum nama
variabel yang akan dicari alamatnya
Apa Itu Pointers ?
Apa Itu Pointers ?
• Contoh :
% a.out
DataInt disimpan di alamat :
3221219956
% a.out
DataInt disimpan di alamat :
3221219828
% a.out
DataInt disimpan di alamat :
3221219700
% a.out
DataInt disimpan di alamat :
3221219572
#include <stdio.h>
int main() {
int DataInt = 5;
printf(“DataInt disimpan di alamat : %u\n", &DataInt);
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 7
Apa Itu Pointers ?
• Cara
mengakses
DataInt :
– Dengan
pengenal
DataInt
– Dengan alamat
3221219572
3221219572 3221219576 3221219580 3221219584 3221219560 3221219564 32212195685
?
?
DataInt
3221219572 3221219576 3221219580 3221219584 3221219560 3221219564 32212195685
?
?
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 8
Mendeklarasikan Sebuah
Pointer
• Syntax
type *identifier;
• Example
#include <stdio.h>int main() {
int DataInt = 5;
int *PtrInt; PtrInt = &DataInt;
printf(“PtrInt adalah: %u\n", PtrInt);
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 9
Mendeklarasikan Sebuah
Pointer
• Deklarasi dalam satu statemen
int
myInt,
*
intPtr, intArray[10];
S
e
bu
ah
Vari
abel
Se
bua
h
P
o
int
e
r
Sebuah
Array
Merunut Pointer
• Jika ingin merunut kemana sebuah pointer
menunjuk dalam suatu tempat di dalam
memori maka digunakan operator
dereferencing
*
*
PtrInt
• Dapat dilakukan
read
atau mengubah nilai
yang ditunjuk oleh pointer seperti jika kita
melakukan terhadap sebuah variabel
*
PtrInt = 6;
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 11
Merunut Pointer
• Contoh
• Output
#include <stdio.h>
int main() {
int
DataInt = 5;
int *
PtrInt;
PtrInt =
&
DataInt;
printf
("
%i\n
",
*
PtrInt);
*
PtrInt = 7;
printf
("
%i\n
",
DataInt
);
}
5
7
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 12
Pointers dan Argumen
Function
• Kita dapat melewatkan nilai sebagai
sebuah argumen
• Hal ini disebut
pass-by-value
#include <stdio.h>
void
example(
int
x);
int main
() {
int
y = 5;
example(y);
printf
("
%i\n
", y);
}
void
example(
int
x)
{
x = 7;
}
5
X
Konteks untuk function main()
5
y
7
y
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 13
Pointers dan Argumen
Function
• Bagaimana jika kita menginginkan
fungsi
example
dapat mempengaruhi
y dalam function
main()
?
– Dapat dilewatkan nilai ke functions
– Sebuah alamat adalah sebuah nilai
– Dapat melewatkan sebuah alamat ke
function
– Sebuah argumen dapat berupa pointer
– Dengan pointer kita dapat mengelola
variabel diluar jangkauan function.
• Hal ini disebut
pass-by-reference
Pointers dan Argumen
Function
• Example
#include <stdio.h>
void
example(
int *
ptr);
int main()
{
int
y = 5;
example(
&
y);
printf
("
%i\n
", y);
}
void
example
(int *
ptr
) {
*
ptr = 7;
}
5
X
5
y
5
ptr
3221 2195 72 3221 2195
3221 2195 72 3221 2195
7
Konteks untuk function main()
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 15
Mengembalikan Nilai Lebih
Dari 1
• Biasanya function yang kita tulis
hanya dapat mengembalikan 1 nilai
• Sekarang kita dapat menulis sebuah
function yang mengembalikan lebih
dari satu hal.
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 16
Mengembalikan Nilai Lebih
Dari 1
• Contoh : Program Pertukaran Nilai
#include <stdio.h>
void tukar(int *ptr1, int *ptr2); int main() {
int num1=1, num2=2;
tukar(&num1,&num2);
printf("%i,%i\n", num1, num2);
}
void tukar(int *ptr1, int *ptr2) { int temp;
temp = *ptr1; // 1
*ptr1 = *ptr2; // 2
*ptr2 = temp; // 3
}
temp
num2 num1
3 1
2
temp
num2 num1
3 1
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 17
Pointer dan Array
• Ketika mendeklarasikan array, maka
sistem operasi akan mengalokasikan
memori
• Setelah mengalokasikan memori,
sistem operasi akan memberi
alamat elemen pertama array.
int
a[5];
2 3 4 0 1 2 3 4 0
0 11 22 33 44
a
Pointer dan Array
• Pengenal untuk sebuah array adalah
sebuah pointer ke elemen pertama dari
array.
• Sehingga kita dapat menggunakan
notasi pointer dan notasi array untuk
menunjuk lokasi yang sama.
int
a[5];
int *
ptr;
ptr
=
a;
ptr[2] = 123;
2 3 4
0 1 2 3 4
0
0 11 22 33 44
a
ptr
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 19
Pointer dan Array
• Passing Array ke Function
– Jika kita melewatkan array sebagai argumen ke
sebuah function, maka salinan array yang
dibuat tidak seperti jika kita melewatkan
sebuah argumen biasa.
– Yang dilewatkan adalah alamat awal dari array.
– Jika kita membuat perubahan ke array dalam
function, maka perubahan akan berlaku pada
array yang sebenarnya.
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 20
Pointer dan Array
• Kadang, pointer digunakan seperti jika
kita menggunakan array sebagai sebuah
argumen.
void
getMessage
(char
mes[]) {...
memiliki arti yang sama dengan :
void
getMessage
(char *
mes) {...
• Sebagai contoh dalam library
string.h
:
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 21
Aritmetika Pointer
• Sebuah alamat adalah sebuah
bilangan
• Sehingga kita dapat melakukan
operasi pada sebuah alamat yang
disimpan dalam pointer untuk
mendapatkan alamat relatif dari
sebuah memori.
h
e
l
l
o
\0
0
1
2
3
4
5
6
7
str
str+3
h
e
l
l
o
\0
0
1
2
3
4
5
6
7
str
str+3
Aritmetika Pointer
• Contoh :
–
printf()
dengan
%s
membutuhkan sebuah
titik awal string dan akan
mencetak sampai
ditemukan
'\0'
– Dalam contoh, jika
digunakan
str
maka akan
muncul output "
hello"
– Jika digunakan 3 karakter
setelah lokasi yang
pertama (
str+3
) maka
menghasilkan keluaran
"lo"
#include <stdio.h>
int main() {
char
str[8] = "hello";
printf
("
%s\n
", str);
printf
("
%s\n
",str+3);
}
h
e
l
l
o
\0
0 1 2 3 4 5 6 7str
str+3
h
e
l
l
o
\0
0 1 2 3 4 5 6 7str
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 23
Aritmetika Pointer
• Substring
• Membandingkan 4 karakter terakhir
h
e
l
l
o
\0
0 1 2 3 4 5 6 7str1
str1 + strlen(str1) - 4
t
e
s
t
.
t
0 1 2 3 4 5 6 7x
t
h
e
l
l
o
\0
0 1 2 3 4 5 6 7str2
str2 + strlen(str2) - 4
a
b
c
.
d
a
0 1 2 3 4 5 6 7t
\0
8\0 …
…
if( strcmp(str1+strlen(str1)-4, str2+strlen(str2)-4) == 0) { printf("4 karakter terakhir sama\n");
} else {
printf("4 karakter terakhir berbeda");
}
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 24
Aritmetika Pointer
• Jika akan mengakses 4 elemen
string, maka menggunakan notasi
array
str[3]
…atau menggunakan aritmetika
pointer
*(str+3)
– Arti : Menuju ke lokasi ke-3 dari
str
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 25
Pointer Untuk Data Besar
• Jika kita menggunakan
pass-by-value
maka
akan dibuat salinan dari nilai yang kita
lewatkan.
• Hal ini tidak menimbulkan masalah untuk nilai
yang membutuhkan memori dengan jumlah
kecil.
• Jika sebuah function akan mengakses sebuah
data yang membutuhkan memori besar, maka
proses membuat salinan akan membutuhkan
waktu dan menghabiskan memori yang besar.
• Sehingga sebaiknya digunakan
pass-by-reference
untuk melewatkan data yang besar,
sehingga tidak menimbulkan masalah.
Pointer Untuk Data Besar
• Tetapi jika menggunakan
pass-by-reference,
maka perubahan data pada
function mempengaruhi data yang
sebenarnya.
• Jika kita tidak menginginkan perubahan
data tersebut, maka dapat digunakan
const
untuk menunjuk argumen dan ini
menyebabkan data sebenarnya tidak
akan ikut berubah.
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 27
Array of Pointer
• Konsep dasar: jika Anda butuh
banyak pointer
buatlah array of
pointer
• Seperti apakah ilustrasi array of
pointer?
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 28
Array of Pointer
Setiap elemen berisi
alamat dari sebuah
lokasi di dalam memori
[0] [1] [2] [3] [4] [5] [6] [7] [8]
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 29
PENDEKLARASIAN
ARRAY OF POINTERS
• Bandingkan beberapa deklarasi berikut:
– Integer bukan array :
int
i;
– Pointer ke integer
:
int *
ip;
– Array 9 integer
:
int
intAra[9];
– Array 9 pointer ke integer:
int *
intPtrAra[9];
• Tips: agar mudah dipahami,
bacalah deklarasi dari KANAN ke KIRI
PENDEKLARASIAN
ARRAY OF POINTER
• Bagaimana dengan pointer ke array of
char?
• Contoh:
–
char *
kota[5];
• Deklarasi dan inisialisasi pointer dapat
dilakukan pada saat yang sama.
Contoh:
–
char *
kota[5] = {“Jakarta”,
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 31
PENDEKLARASIAN
PENDEKLARASIAN
ARRAY OF POINTER
ARRAY OF POINTER
#include <stdio.h> #include <conio.h> main()
{ int ctr;
char *cities[3] = {“Yogya”,”Jakarta”,”BandarLampung”};
clrscr();
printf(“Menampilkan Kota”);
for (ctr = 0;ctr < 3;ctr++)
{ printf(“%s”,cities[ctr]);}
cities[0] = “Sleman”; cities[1] = “Bekasi”; cities[2] = “Kotabumi”;
printf(“Menampilkan Kota setelah diubah”);
for (ctr = 0;ctr < 3;ctr++)
{ printf(“%s”,*(cities+ctr));} }
Pert. 3a Struktur Data - FMIPA USD - 2003 Hal. 32
POINTER SEBAGAI
PARAMETER