Praktikum Algoritma dan Pemrograman Lanjut
MODUL V POINTER DAN STRING
I.
II.
TUJUAN 1.
Mahasiswa dapat menjelaskan tentang konsep dari variabel pointer
2.
Mahasiswa dapat menjelaskan tentang pointer dan string
3.
Mahasiswa dapat menjelaskan tentang pointer yang menunjuk pointer
DASAR TEORI 1.
VARIABEL POINTER Pointer merupakan sebuah variabel yang menyimpan alamat memori. Cara mendeklarasikan variabel pointer dengan menggunakan simbol asterisk (*) antara tipe data dan nama variabel. Berikut ini bentuk umum dari pendeklarasian sebuah variabel pointer: tipe_data *nama_pointer; Pemberian spasi pada tanda * tidak akan mengubah arti, sehingga penulisan bentuk umum dari deklarasi variabel pointer dapat juga dituliskan sebagai berikut: tipe_data* nama_pointer; atau tipe_data * nama_pointer; Contoh: int *a; char *b; Pada pernyataan diatas, a dan b adalah variabel pointer. a berisi alamat memori dari tipe int, dan b berisi alamat memori dari tipe char. Secara umum a disebut variabel pointer dari tipe int, dan b disebut variabel pointer dari tipe char.
int *a, b; Pada pernyataan diatas, hanya a yang merupakan variabel pointer. b merupakan variabel int, bukan variabel pointer. int *a, *b; a dan b merupakan variabel pointer dari tipe int.
Operator Alamat (&) Simbol ampersand (&) disebut sebagai operator alamat, yang merupakan sebuah operator unary yang mengembalikan alamat dari operannya. Contoh: int x; int *y; Pernyataan: y = &x; mengisikan alamat dari x ke y, sehingga x dan nilai dari y menunjuk ke alamat memori yang sama.
V-1
Praktikum Algoritma dan Pemrograman Lanjut
Operator Dereference (*) Simbol asterisk (*) selain digunakan sebagai perkalian juga bisa digunakan debagai operator dereference atau operator indirection, yang menunjuk pada objek (nilai) dari operannya. Contoh: int x = 25; int *p; p = &x; // mengisikan alamat dari x ke dalam p Pernyataan: cout << *p << endl; menampilkan nilai yang disimpan dalam ruang memori yang ditunjuk oleh p, yang merupakan nilai dari x. Perhatikan pernyataan dibawah ini: int *p; int q; Pada pernyataan diatas, p adalah variabel pointer dari tipe int dan q adalah variabel dari tipe int (Gambar 5.1). Diasumsikan bahwa lokasi memori 1200 dialokasikan untuk p dan lokasi memori 1800 dialokasikan untuk q. Pernyataan: q =78; menyimpan 78 didalam q, yaitu di lokasi memori 1800 (Gambar 5.2). Main memory
. . . p 1200
1800
. . . q 1800
78
. . .
V-2
Praktikum Algoritma dan Pemrograman Lanjut
2.
TIPE STRING String digunakan untuk merepresentasikan data yang berupa teks. String merupakan urutan dari satu atau lebih karakter. Dalam C++, string diapit oleh tanda petik dua. Sebelum menggunakan tipe data string, program harus menyertakan header string seperti berikut: #include <string> Pernyataan: string nama = “Pemrograman Lanjut”; mendeklarasikan nama menjadi variabel string dan menginisialisasikan nama ke “Pemrograman Lanjut”. Posisi dari karakter pertama, P, adalah 0; posisi karakter kedua, e, adalah 1; dst. Posisi dari karakter pertama pada variable string dimulai dari 0, bukan 1. Perhatikan deklarasi dibawah ini: string str1, str2, str3; Pernyataan: str1 = “Hello There”; menyimpan string “Hello There” pada str1. Pernyataan: str2 = str1; menyalin nilai str1 ke str2. Jika str1 = “Sunny”, pernyataan: str2 = str1 + “ Day”; menyimpan string “Sunny Day” kedalam str2. Jika str1 = “Hello there”, pernyataan: str1[6] = ‘T’; mengganti karakter t dengan karakter T. Posisi dari karakter pertama pada variabel string adalah 0. Jadi, karena t adalah karakter ketujuh di str1, posisinya adalah 6. Operasi string Tambahan Tipe data string terdiri dari beberapa fungsi untuk manipulasi string. Lima fungsi diantaranya adalah: length, size, find, substr, dan swap. 1)
Fungsi length Fungsi length mengembalikan jumlah karakter di dalam string. Sintaks untuk memanggil fungsi length adalah: nama_string.length() dimana nama_string adalah nama variable dari tipe string.
2) Fungsi size Fungsi size mempunyai kegunaan yang sama dengan fungsi length, yaitu untuk menunjukkan jumlah karakter string. Sintaks-nya adalah sbb: nama_string.size() dimana nama_string adalah nama variable dari tipe string.
V-3
Praktikum Algoritma dan Pemrograman Lanjut
3)
Fungsi find Substring dalam suatu string dapat dicari dengan menggunakan fungsi find. Sintaks untuk memanggil fungsi find adalah sbb: nama_string.find(ekspresi_string) atau nama_string.find(ekspresi_string, pos)
4) Fungsi substr Fungsi substr digunakan untuk mengambil bagian teks dalam string. Sintaks untuk memanggil fungsi substr adalah sbb: nama_string.substr(ekspresi1, ekpresi1) Contoh: string sentence; string str; sentence = “It is cloudy and warm.”; Pada pernyataan: cout << sentence.substr(0, 5) << endl;
outputnya adalah: It is Pada contoh diatas, fungsi substr digunakan untuk mengambil bagian teks dari karakter nol sampai karakter lima. 5) Fungsi swap Fungsi ini digunakan untuk menukar isi dari dua variabel string. Sintaks dari fungsi swap adalah sbb: nama_string1.swap(nama_string2);
V-4
Praktikum Algoritma dan Pemrograman Lanjut
3.
POINTER DAN STRING Hubungan antara pointer dan string ditunjukkan oleh contoh program 3. Contoh Program 3: #include
using namespace std; int main() { char *pkuliah = "Pemrograman Lanjut"; cout << "String yang ditunjuk oleh pkuliah = " << pkuliah << endl; return 0; }
pkuliah adalah variabel pointer yang menunjuk ke obyek bertipe char dan menempatkan konstanta “Prolan” dalam suatu memori. Kemudian pointer pkuliah akan menunjuk ke lokasi string “Prolan” (Gambar 5.5) Lokasi awal string “Prolan” pkuliah P
r
o
l
a
n
\n
Gambar 5.5 Pointer dan string Hubungan antara pointer dan string juga ditunjukkan oleh contoh program 1. Pada contoh program 1, terdapat dua fungsi yang digunakan untuk menyalin string ke karakter array. Fungsi tersebut menyelesaikan tugas yang sama, tetapi diimplementasikan berbeda. Pada contoh program1, fungsi copy1 menggunakan notasi subscript array untuk menyalin string s2 ke karakter array s1. Fungsi tersebut mendeklarasikan variabel pencacah integer i untuk digunakan sebagai subscript array. Header struktur for menunjukkan operasi menyalin (copy) secara keseluruhan, sedangkan body dari struktur for adalah pernyataan kosong. Header menetapkan bahwa i diinisialisasi ke nol dan bertambah satu pada setiap iterasi dari loop. Kondisi for, (s1 [i] = s2 [i]) != '\ 0', melakukan operasi penyalinan (copy) karakter per karakter dari s2 ke s1. Ketika karakter null ditemui di s2, karakter null di-assign ke s1, dan loop berakhir, karena karakter null adalah sama dengan '\ 0'.
V-5
Praktikum Algoritma dan Pemrograman Lanjut
Contoh Program 1: #include using std::cout; using std::endl; void copy1(char*, const char*); void copy2(char*, const char*); int main() { char string1[10]; char *string2 = "Hello"; char string3[10]; char string4[] = "Good Bye"; copy1(string1, string2); cout << "string1 = " << string1 << endl; copy2(string3, string4); cout << "string3 = " << string3 << endl; return 0; } void copy1(char *s1, const char *s2) { for (int i = 0; (s1[i] = s2[i])!='\0';i++); } void copy2 (char *s1, const char *s2) { for (;(*s1 = *s2)!='\0';s1++, s2++); }
Fungsi copy2 menggunakan pointer dan aritmatika pointer untuk menyalin string s2 ke karakter array s1. Header struktur for melakukan seluruh operasi copy. Header tidak termasuk inisialisasi variabel. Seperti dalam fungsi copy1, kondisi (*s1 = s2)! = '\0' melakukan operasi copy. Pointer s2 adalah dereference, dan karakter hasilnya di-assign ke pointer s1 dereference. Setelah penugasan di dalam kondisi (setelah (* s1 = * s2)! = '\ 0' ), terdapat loop increment yang keduanya merupakan pointer (s1++, s2++), sehingga masing-masing menunjuk ke elemen berikutnya dari array s1 dan karakter berikutnya dari string s2. ketika loop menjumpai karakter null di s2, karakter null di-assign ke pointer s1 dereference dan loop berakhir. Perhatikan bahwa "bagian increment" dari struktur for ini memiliki dua ekspresi increment yang dipisahkan oleh operator koma.
V-6
Praktikum Algoritma dan Pemrograman Lanjut
4.
Pointer ke pointer Dalam C++, sebuah pointer dapat menunjuk ke pointer lain yang telah menunjuk ke alamat tertentu. Kondisi tersebut dinamakan multiple indirection atau pointer ke pointer. Pointer
Variabel
Alamat
Nilai
Gambar 5.6 Single Indirection
Pointer
Pointer
Variabel
Alamat
Alamat
Nilai
Gambar 5.7 Multiple Indirection Pada single indirection, pointer langsung menunjuk ke alamat dari suatu variabel. Pada multiple indirection, terdapat pointer yang menunjuk ke pointer yang sedang menunjuk ke alamat dari suatu variabel. Untuk mendeklarasikan pointer ke pointer, digunakan tanda asterisk sebanyak dua kali (**). Contoh pendeklarasian pointer ke pointer: int **p; Contoh pointer ke pointer dapat dilihat pada contoh program 2. Contoh Program 2: #include using namespace std; int main() { int X = 25; int *P1; int **P2; P1 = &X; P2 = &P1; // Menampilkan nilai cout<<"Nilai X : "<<X<<endl; cout<<"Nilai *P1 : "<<*P1<<endl; cout<<"Nilai *P2 : "<<*P2<<endl; cout<<"Nilai **P2 : "<<**P2<<endl; cout<<endl; // Menampilkan alamat cout<<"Nilai &X : "<<&X<<endl; cout<<"Nilai P1 : "<
V-7
Praktikum Algoritma dan Pemrograman Lanjut
Output dari kode program diatas adalah sbb:
Nilai Nilai Nilai Nilai
X *P1 *P2 **P2
Nilai &X Nilai P1 Nilai P2
: 25 : 25 : 0x22ff08 : 25 : 0x22ff08 : 0x22ff08 : 0x22ff04
Pada contoh diatas, nilai X dapat diakses dengan menggunakan *P1 atau **P2, sedangkan alamat dari variable X dapat diakses dengan menggunakan &X, P, ataupun *P2 (*P2 merupakan nilai yang menempati alamat yang ditunjuk oleh pointer P2). Pointer P2 tidak menunjuk ke tipe data int, akan tetapi menunjuk ke pointer P1. P2 menyimpan alamat dari pointer P1. Untuk contoh diatas, P2 menyimpan alamat 0x22ff04.
V-8
Praktikum Algoritma dan Pemrograman Lanjut
III.
GUIDED 1.
Pointer #include using namespace std; int main() { int *p; int x = 37; cout << "Baris 1: x " << x << endl; //Baris 1 p = &x; cout << "Baris 3: *p = " << *p << ", x = " << x << endl; //Baris 3 *p = 58; cout << "Baris 5: *p = " << *p << ", x = " << x << endl; //Baris 5 cout << "Baris 6: Alamat dari p = " << &p << endl; //Baris 6 cout << "Baris 7: Nilai dari p = " << p << endl; //Baris 7 cout << "Baris 8: Nilai dari lokasi memori yang ditunjuk oleh *p = " << *p << endl; //Baris 8 cout << "Baris 9: Alamat dari x = " << &x << endl; //Baris 9 cout << "Baris 10: Nilai dari x = " << x << endl; //Baris 10 return 0;
} 2. String #include #include <string> using namespace std; int main() { string str1 = "Pemrograman Lanjut"; string str2 = "C++"; // Menampilkan panjang string cout<<"str1: "<<str1<<endl; cout<<"str2: "<<str2<<endl; cout<<"Panjang string str1: " <<str1.size()<<endl; cout<<"Panjang string str2: " <<str2.length()<<endl; cout<<"'Lanjut' ditemukan pada indeks ke-" <<str1.find("Lanjut") <<endl; cout<<str1.substr(0,9)<<endl; //menukar string str1.swap(str2); cout<<"str1: "<<str1<<endl; cout<<"str2: "<<str2<<endl; return 0; }
V-9
Praktikum Algoritma dan Pemrograman Lanjut
3. Pointer dan String #include using std::cout; using std::endl; void copy1(char*, const char*); void copy2(char*, const char*); int main() { char string1[10]; char *string2 = "Hello"; char string3[10]; char string4[] = "Good Bye"; copy1(string1, string2); cout << "string1 = " << string1 << endl; copy2(string3, string4); cout << "string3 = " << string3 << endl; return 0; } void copy1(char *s1, const char *s2) { for (int i = 0; (s1[i] = s2[i])!='\0';i++); } void copy2 (char *s1, const char *s2) { for (;(*s1 = *s2)!='\0';s1++, s2++); } 4. Pointer ke Pointer #include using namespace std; int main() { int X = 25; int *P1; int **P2; P1 = &X; P2 = &P1; // Menampilkan nilai cout<<"Nilai X : "<<X<<endl; cout<<"Nilai *P1 : "<<*P1<<endl; cout<<"Nilai *P2 : "<<*P2<<endl; cout<<"Nilai **P2 : "<<**P2<<endl; cout<<endl; // Menampilkan alamat cout<<"Nilai &X : "<<&X<<endl; cout<<"Nilai P1 : "<
V - 10
Praktikum Algoritma dan Pemrograman Lanjut
IV.
UNGUIDED 1.
Buat program untuk menampilkan sebaris string berikut ini: “Pemrograman Lanjut“ menggunakan variable pointer (pointer to string).
2.
Buat potongan program untuk mencetak huruf ketiga ( m ) dari kata : “Pemrograman Lanjut “ dengan menggunakan variabel pointer.
V - 11