Array Bagian 2
String Variabel • ANSI C++ terdapat include tipe string yang di desain yang membuatnya lebih mudah untuk memanipulasi string dari suatu teks • Kita dapat menggunakan istilah string untuk menggantikan suatu array yang berisikan sekumpulan karakter dengan diakhiri karakter null
Program Menggabungkan 2 Tipe String // StringConcatenate - concatenate two string type // variables with a “ - “ in the middle #include
#include #include #include <string> using namespace std; int main(int nNumberofArgs, char* pszArgs[]) { // read first string... string string1; cout << “Enter string #1:”; cin >> string1;
// ...now the second string... string string2; cout << “Enter string #2:”; cin >> string2; // accumulate both strings into a single buffer string buffer; string divider = “ - “; buffer = string1 + divider + string2; // ...and display the result cout << “\n” << buffer << endl; // wait until user is ready before terminating program // to allow the user to see the program results system(“PAUSE”); return 0; }
• Fungsi tersebut mendefinisikan dua variabel, yakni string1 dan string2 • Type string bukanlah type intrinsic C++, maksudnya tipe tersebut bukanlah type yang dibangun dalam sintax bahasa
Pointer
• Sejauh ini bahasa C++ sudah cukup konvensional dibandingkan bahasa pemrograman lainnya • Kita akan memulai dengan aliran sintax pointer, kemudian kita akan mempelajari beberapa alasan para programmer menggunakan pointer yang mengatasi masalah pemrograman
• Program berikut memperlihatkan ukuran dari tipe variabel : // VariableSize - output the size of each type of // variable #include #include #include using namespace std;
int main(int nNumberofArgs, char* pszArgs[] { bool b; char c; int n; long l; float f; double d;
cout << “sizeof a bool = “ << sizeof b << endl;
cout cout cout cout cout
<< << << << <<
“sizeof “sizeof “sizeof “sizeof “sizeof
a char = “ << sizeof c << endl; an int = “ << sizeof n << endl; a long = “ << sizeof l << endl; a float = “ << sizeof f << endl; a double= “ << sizeof d << endl;
// wait until user is ready before terminating program // to allow the user to see the program results system(“PAUSE”); return 0; }
• size of pada C++ digunakan untuk mengembalikan suatu nilai ke dalam bentuk byte • Output Program : sizeof a bool = 1 sizeof a char = 1 sizeof an int = 4 sizeof a long = 4 sizeof a float = 4 sizeof a double= 8 Press any key to continue . . .
Apa itu Address (Alamat) ? • Setiap variabel C++, distorekan dalam suatu memori • Variabel intReader mungkin berada pada alamat 0x100, sedangkan floatReader berada pada lokasi di atas 0x180
Operator Alamat
• Program berikut memberikan gambaran, bagaimana tata letak suatu variabel dalam memori : // Layout - this program tries to give the // reader an idea of the layout of // local memory in her compiler #include #include #include using namespace std;
int main(int nNumberofArgs, char* pszArgs[]) { int end; int n; long l; float f; double d; // set output to hex mode cout.setf(ios::hex); cout.unsetf(ios::dec);
// output the address of each variable // in order to get an idea of how variables are // laid out in memory cout << “--- = 0x” << &end << “\n”; cout << “&n = 0x” << &n << “\n”; cout << “&l = 0x” << &l << “\n”; cout << “&f = 0x” << &f << “\n”; cout << “&d = 0x” << &d << “\n”; // wait until user is ready before terminating program // to allow the user to see the program results system(“PAUSE”); return 0; }
• Hasil eksekusi : --- = 0x0x22ff6c &n = 0x0x22ff68 &l = 0x0x22ff64 &f = 0x0x22ff60 &d = 0x0x22ff58 Press any key to continue . . .
• Variabel Anda boleh saja bervariasi • Mengapa variabel n dengan variabel yang dideklarasikan sebelumnya, selisihnya 4 byte
Penggunaan Variabel Pointer • Variabel pointer adalah sebuah variabel yang berisikan alamat, dan biasanya alamat itu adalah alamat dari variabel yang lain. • Contoh code yang menggunakan 2 operator pengalamatan : mySon = &DadsRoom; // tell mySon the address of Dad’s Room room = *mySon; // “Dad’s room number is”
• Potongan code C++ berikut menunjukkan penggunaan operator : void fn() { int intVar; int* pintVar; pintVar = &intVar; // pintVar now points to intVar *pintVar = 10; // stores 10 into int location // pointed at by pintVar }
• Fungsi fn() dimulai dengan pendeklarasian intVar • Variabel pointer dideklarasikan sperti variabel biasanya, kecuali dengan penambahan operator unary *
Menggunakan berbagai Tipe Pointer int* pintVar = &intVar;
// both sides of the assignment are // of type int*
• Karena pintVar adalah tipe int*, maka tipe dari *pintVar adalah tipe int : *pintVar = 10;
// both sides of the assignment are // of type int
• Pointer dari tipe variabel yang lain, juga diekspresikan dengan cara yang sama : double doubleVar; double* pdoubleVar = &doubleVar; *pdoubleVar = 10.0; • Sebuah pointer pada mesin sekelas Pentium memakan size sebesar 4 byte
• Sekarang apa yang terjadi jika diberikan code berikut : int n1; int* pintVar; pintVar = &n1; *pintVar = 100.0;
• Assignment kedua mencoba untuk menyimpan nilai 100.0 double 8 byte ke n1 yang telah dialokasikan 4 byte • Hal ini memungkinkan kita untuk mengcast ke variabel lain : int iVar; double dVar = 10.0; iVar = (int)dVar;
• Dan mungkin juga kita mengcast dari suatu tipe pointer ke tipe pointer yang lain : int* piVar; double dVar = 10.0; double* pdVar; piVar = (int*)pdVar;
• Program berikut mendemonstrasikan penggunaan pointer yang kacau : // LayoutError - demonstrate the results of // a messing up a pointer usage #include #include #include using namespace std; int main(int nNumberofArgs, char* pszArgs[]) { int upper = 0; int n = 0; int lower = 0;
// output the values of the three variables before... cout << “the initial values are” << endl; cout << “upper = “ << upper << endl; cout << “n = “ << n << endl; cout << “lower = “ << lower << endl; // now store a double into the space // allocated for an int cout << “\nStoring 13.0 into the location &n” << endl; double* pD = (double*)&n; *pD = 13.0;
// display the results
cout cout cout cout
<< << << <<
“\nThe “upper “n = “ “lower
final results are:” << endl; = “ << upper << endl; << n << endl; = “ << lower << endl;
// wait until user is ready before terminating program // to allow the user to see the program results system(“PAUSE”); return 0;
}
• Output program : the initial values are upper = 0 = 0 lower = 0 Storing 13.0 into the location &n The final results are: upper = 1076494336 n = 0 lower = 0 Press any key to continue . . .
Dari Pointer sampai ke Fungsi • Diberikan kode berikut : { intArg = 10; // value of intArg at this point is 10 } void parent(void) { int n1 = 0; fn(n1); // value of n1 at this point is 0 }
• Fungsi parent() menginisialisasi variabel integer n1 bernilai 0 • Seperti tipe intrinsic yang lain, suatu pointer dapat dijadikan sebagai argumen suatu fungsi : void fn(int* pintArg) { *pintArg = 10; } void parent(void) { int n = 0; fn(&n); // this passes the address of i // now the value of n is 10 }
• Dalam hal ini, alamat n dimasukkan ke fungsi fn() bukan nilai n. • Alamat (Address) dari n ? • Contoh program, dengan n sebagai reference : void fn(int& intArg) { intArg = 10; } void parent(void) { int n = 0; fn(n); // here the value of n is 10 }
• Dalam hal ini, reference dimasukkan ke fungsi fn() bukan nilai n. • Catatan : reference bukanlah tipe yang sebenarnya. Dengan demikian penamaan fungsi adalah fn(int) bukan fn(int &)
Menggunakan Block Memori (Heap) • Heap adalah block memori yang dapat diakses untuk suatu keperluan • Sebuah fungsi yang mengembalikan alamat (address) double didekalarasikan : double* fn(void);
Membatasi Scope • Variabel memiliki suatu sifat selain nilai dan tipenya yakni scope. • Scope adalah suatu rentang dimana variabel didefinisikan • Diberikan suatu kode : // the following variable is accessible to // all functions and defined as long as the // program is running(global scope) int intGlobal;
// the following variable intChild is accessible // only to the function and is defined only // as long as C++ is executing child() or a // function which child() calls (function scope) void child(void) { int intChild; }
// the following variable intParent has function // scope void parent(void) { int intParent = 0; child(); int intLater = 0; intParent = intLater; } int main(int nArgs, char* pArgs[]) { parent(); }
• Eksekusi dimulai dengan main() kemudian ke fungsi parent() • Statement kedua dari parent() memanggil child() • Ketika keluar dari child(), variabel intChild keluar dari ruang lingkup • parent() dieksekusi, variabel intLater masuk kedalam scope pada pendeklarasian • Karena variabel intGlobal dideklarasikan secara global, maka variabel ini dapat diakses oleh ketiga fungsi, selama program masih berjalan
Menjelaskan Masalah Scope • Segmen kode berikut mengkompile tanpa error tetapi tidak akan bekerja : double* child(void) { double dLocalVariable; return &dLocalVariable; }
void parent(void) { double* pdLocal; pdLocal = child(); *pdLocal = 1.0; }
• Masalahnya adalah dLocalVariable didefinisikan didalam scope fungsi child() • Kesalahan ini sering terjadi, tapi dalam sejumlah cara yang berbeda
Menyediakan Solusi Menggunakan Heap • Asal masalah scope dikarenakan C++ mengambil kembali memori lokal yang telah didefinisikan • Heap memori dialokasikan menggunakan perintah new dengan diikuti tipe objek yang telah dialokasikan double* child(void) { double* pdLocalVariable = new double; return pdLocalVariable; }
• Lokasi memori dikembalikan oleh new yang tidak keluar dari scope hingga secara eksplisit kembali ke heap dengan menggunakan perintah delete
void parent(void) { // child() returns the address of a block // of heap memory double* pdMyDouble = child(); // store a value there *pdMyDouble = 1.1; // ... // now return the memory to the heap delete pdMyDouble; pdMyDouble = 0; // ... }
• Pointer yang dikembalikan oleh child() digunakan untuk menstore nilai double
Pointer Bagian 2
• C++ membuat programmer untuk mengoperasikan variabel pointer sehingga membuat variabel tersebut menjadi tipe variabel yang lebih simpel
Mendefinisikan Operasi pada Variabel Pointer
Menjelaskan Array dalam Sudut Pandang Variabel Pointer • Ambil suatu model yang menyerupai memori komputer • Misalnya suatu kasus Array 32 1-byte tipe karakter diberi nama charArray • Jika byte pertama distorekankan di address 0x110, maka range address dari array 0x110 – 0x12f • Bentuk ekspresi : ptr = &charArray[0]; • Variabel ptr berisikan address 0x110