PENGERTIAN STRUCT DAN POINTER BESERTA CONTOHNYA PADA C++
PENGERTIAN STRUCT DAN POINTER BESERTA CONTOHNYA PADA C++
Jika pada array, masing-masing komponennya menggunakan tipe data yang sama, lain halnya pada sebuah struct atau record yang mempunyai komponen-komponen yang mempunyai tipe data yang berbeda. Misalnya sebuah struct tentang data seseorang, yang terdiri dari nama, alamat, umur, jurusan. Semua data tersebut dihimpun dalam satu struct dengan nama, alamat, umur, dan jurusan sebagai field-field nya. Jadi struct ini merupakan perluasan dari tipe data array.
• Deklarasi struct
1. Bentuk suatu struct terlebih dahulu, meliputi field- field yang ada didalam struct beserta tipe datanya untuk masing-masing field.
struct namaStruct {
tipedata namafield1;
tipedata namafield2;
tipedata namafield3;
};
e.g :
struct StudentRec {
string name;
string idNum;
float gpa;
};
2. Bentuk variabel dengan tipe struct tersebut. namaStruct
namaVariabel;
e.g :
StudentRec theStudent;
• Pengaksesan structs
3. Melakukan operasi pada setiap elemen dari struct secara individual. Misalnya operasi pengisian nilai pada tiap-tiap elemen. Nilai-nilai tertentu dapat di-assign, dengan aturan pengacuan terhadap field dari sebuah struct.
nama_variabel.nama_field = nilai;
e.g :
theStudent.name = "Sally";
atau
cin >> theStudent.idNum;
4. Menampilkan data yang ada didalam struct .
cout<<nama_variabel.nama_field;
e.g :
cout<< theStudent.gpa;
Nested struct
struct fullname {
string firstname;
string lastname;
};
struct StudentRec {
fullname name;
string idNum;
float gpa;
};
Array of Struct
struct fullname {
string firstname;
string lastname;
};
struct StudentRec {
fullname name;
string idNum;
float gpa;
};
StudentRec theStudent[10];
E. Skenario
1. Kegiatan 1 : Membuat program membuat data pribadi menggunakan struct a.
Langkah 1 : Deklarasi struct
struct fullname {
string firstname;
string lastname;
};
struct StudentRec {
fullname name;
string idNum;
float gpa;
};
b. Langkah 2 : Deklarasi dan Inisialisasi variabel
StudentRec theStudent[10];
c. Langkah 3 : Proses
int main() {
cout<<”Masukkan banyaknya mahasiswa : ”;
cin>>n;
cout<<”Data mahasiswa”<<endl;
for (int i=0;i<n;i++) {
cout<<”Nama depan : “;
cin>>theStudent[i].name.firstname;
cout<<”Nama belakang : “;
cin>>theStudent[i].name.lastname;
cout<<”Nim : “;
cin>>theStudent[i].idNum;
cout<<”IPK : “; cin>>theStudent[i].gpa;
}
d. Langkah 4 : Finalisasi
cout<<”Data mahasiswa”<<endl;
for (int i=0;i<n;i++) {
cout<<theStudent[i].name.firstname;
cout<<theStudent[i].name.lastname;
cout<<theStudent[i].idNum;
cout<<theStudent[i].gpa;
}
return 0;
}
2. Kegiatan 2 : Kompilasi dan Eksekusi program
a. Langkah 1 : Lakukan kompilasi dan eksekusi program pada C++ sehingga keluar tampilan sbb :
2.2 Pointer
1. Konsep Dasar Pointer
Variabel pointer sering dikatakan sebagai variabel yang menunjuk ke obyek lain. Pada kenyataan yang sebenarnya, variabel pointer berisi alamat dari suatu obyek lain (yaitu obyek yang dikatakan ditunjuk oleh pointer). Sebagai contoh, px adalah variabel pointer dan x adalah variabel yang ditunjuk oleh px. Kalau x berada pada alamat memori (alamat awal) 1000, maka px akan berisi 1000. Sebagaimana diilustrasikan pada gambar di bawah ini :
Gambar 4.1. Variabel pointer px menunjuk ke variabel x
2. Mendeklarasikan Variabel Pointer
Suatu variabel pointer dideklarasikan dengan bentuk sebagai berikut :
tipe *nama_variabel
dengan tipe dapat berupa sembarang tipe yang sudah dibahas pada bab-bab sebelumnya, misalnya int, double, float, dsb. Adapun nama_variabel adalah nama dari variabel pointer, misalnya :
int *px; /*contoh 1 */
char *pch1, *pch2; /*contoh 2 */
Contoh pertama menyatakan bahwa px adalah variabel pointer yang menunjuk ke suatu data bertipe int, sedangkan contoh kedua masing pch1dan pch2adalah variabel pointer yang menunjuk ke data bertipe char.
Gambar 4.2. Ilustrasi pendeklarasian variabel pointer.
3. Mengatur Pointer Agar Menunjuk ke Variabel Lain
Agar suatu pointer menunjuk ke variabel lain, mula-mula pointer harus diisi dengan alamat dari variabel yang akan ditunjuk. Untuk menyatakan alamat dari suatu variabel, operator &(operator alamat, bersifat unary) bisa dipergunakan, dengan menempatkannya di depan nama variabel. Sebagai contoh, bila xdideklarasikan sebagai variabel bertipe int, maka &x berarti “alamat dari variabel x”. Adapun contoh pemberian alamat x ke suatu variabel pointer px (yang dideklarasikan sebagai pointer yang menunjuk ke data bertipe int) yaitu :
px = &x
Pernyataan di atas berarti bahwa pxdiberi nilai berupa alamat dari variabel x. Setelah pernyataan tersebut dieksekusi barulah dapat dikatakan bahwa px menunjuk ke variabel x.
4. Mengakses Isi Suatu Variabel Melalui Pointer
Jika suatu variabel sudah ditunjuk oleh pointer, variabel yang ditunjuk oleh pointer tersebut dapat diakses melalui variabel itu sendiri (pengaksesan langsung) ataupun melalui pointer (pengaksesan tak langsung). Pengaksesan tak langsung dilakukan dengan menggunakan operator indirection(tak langsung) berupa simbol *(bersifat unary). Contoh penerapan operator * yaitu : *px yang menyatakan “isi atau nilai variabel/data yang ditunjuk oleh pointer px” . Sebagai contoh jika y bertipe int, maka sesudah dua pernyataan berikut
px = &x;
y = *px;
y akan berisi nilai yang sama dengan nilai x. Dua pernyataan di atas sebenarnya dapat digantikan dengan pernyataan
y = x;
Yang perlu diperhatikan adalah apabila tidak terdapat pernyataan
px = &x;
namun terdapat pernyataan
y = *px;
Hal ini maka y tidaklah berisi nilai x, sebab px belum diatur agar menunjuk ke variabel x. Selain itu tipe variabel pointer dan tipe data yang ditunjuk harus sejenis. Misal : jika variabel yang akan ditunjuk bertipe data int, maka pointer juga harus bertipe data int.
5. Mengakses dan Mengubah Isi Suatu Variabel Pointer
Contoh berikut memberikan gambaran tentang pengubahan isi suatu variabel secara tak langsung (yaitu melalui pointer). Mula-mula pddideklarasikan sebagai pointer yang menunjuk ke suatu data bertipe floatdan d sebagai variabel bertipe float.
Selanjutnya
d = 54.5;
digunakan untuk mengisikan nilai 54,5 secara langsung ke variabel d. Adapun
pd = &d;
digunakan untuk memberikan alamat dari d ke pd.Dengan demikian pd menunjuk ke variabel d.Sedangkan pernyataan berikutnya
*pd = *pd + 10; (atau: *pd += 10; )
merupakan instruksi untuk mengubah nilai variabel d secara tak langsung. Perintah di atas berarti “jumlahkan yang ditunjuk pd dengan 10 kemudian berikan ke yang ditunjuk oleh pd”, atau identik dengan pernyataan
d = d + 10;
Akan tetapi, seandainya tidak ada instruksi
pd = &d;
maka pernyataan
*pd = *pd + 10;
tidaklah sama dengan
d = d + 10;
6. Pointer dan Array (Pointer to Array)
Suatu array secara internal akan diterjemahkan dalam bentuk pointer. Pembahasan berikut akan memberikan gambaran hubungan antara pointer dan array. Misalnya dideklarasikan di dalam suatu fungsi
static int tgl_lahir[3] = { 01, 09, 64 };
dan
int *ptgl;
Kemudian diberikan instruksi
ptgl = &tgl_lahir[0]; //pointer to array of integer
maka ptgl akan berisi alamat dari elemen array tgl_lahir yang berindeks nol. Instruksi di atas bisa juga ditulis menjadi
ptgl = tgl_lahir;
sebab nama array tanpa tanda kurung menyatakan alamat awal dari array. Sesudah penugasan seperti di atas, *ptgl dengan sendirinya menyatakan elemen pertama (berindeks sama dengan nol) dari array tgl_lahir.
7. Pointer dan String (Pointer to String)
Contoh hubungan pointer dan string ditunjukkan pada program berikut
#include <iostream.h>
int main() {
char *pkota = “SEMARANG”;
cout<<”String yang ditunjuk pkota = “<<pkota<<endl;
return 0;
}
Pada program di atas,
char *pkota = “SEMARANG”;
akan menyebabkan kompiler mengalokasikan variabel pkota sebagai variabel pointer yang menunjuk ke obyek bertipe char dan menempatkan konstanta “SEMARANG” dalam suatu memori, kemudian pointer pkota akan menunjuk ke lokasi string “SEMARANG”.
Gambar 4.3. Pointer Menunjuk Data
Pernyataan di atas menyerupai pernyataan
char kota[] = “SEMARANG”;
tetapi sebenarnya kedua pernyataan inisialisasi di depan tidaklah tepat sama. Sebab pkota adalah pointer (menyatakan alamat) yang dengan mudah dapat diatur agar menunjuk ke string lain (bukan string “SEMARANG”),sedangkan kota adalah array (array menyatakan alamat yang konstan, tak dapat diubah).
8. Array dari Pointer (Array of Pointer)
Suatu array bisa digunakan untuk menyimpan sejumlah pointer. Sebagai contoh:
char *namahari[10];
merupakan pernyataan untuk mendeklarasikan array pointer. Array namahari terdiri dari 10 elemen berupa pointer yang menunjuk ke data bertipe char.
Array pointer bisa diinisialisasi sewaktu pendeklarasian, contohnya sbb :
static char *namahari[] = {“Senin”, “Selasa”, “Rabu”, “Kamis”, “Jumat”, “Sabtu”, “Minggu”};
Pada contoh ini,
namahari[0] berisi alamat yang menunjuk ke string “Senin”.
namahari[1] berisi alamat yang menunjuk ke string “Selasa”.
namahari[2] berisi alamat yang menunjuk ke string “Rabu”.
dan seterusnya.
9. Pointer Menunjuk ke Pointer (Pointer to Pointer)
Suatu pointer bisa saja menunjuk ke pointer lain. Gambar berikut memberikan contoh mengenai pointer menunjuk pointer.
Gambar 4.4. Pointer Menunjuk ke Pointer
Untuk membentuk rantai pointer seperti pada gambar di atas, pendeklarasian yang diperlukan berupa
int var_x;
int *ptr1;
int **ptr2;
Perhatikan pada deklarasi di depan:
ƒ var_x adalah variabel bertipe int.
ƒ ptr1 adalah variabel pointer yang menunjuk ke data bertipe int.
ƒ ptr2 adalah variabel pointer yang menunjuk ke pointer int. (itulah sebabnya deklarasinya berupa int **ptr2; )
Agar ptr1 menunjuk ke variabel var_x, perintah yang diperlukan berupa
ptr1 = &var_x;
Sedangkan supaya ptr2 menunjuk ke ptr1, instruksi yang diperlukan adalah
ptr2 = &ptr1;
10. Pointer sebagai Parameter Fungsi
Penerapan pointer sebagai parameter yaitu jika diinginkan agar nilai suatu variabel internal dapat diubah oleh fungsi yang dipanggil. Sebagai contoh dapat dilihat pada fungsi berikut.
void naikkan_nilai (int *x, int *y) {
*x = *x + 2;
*y = *y + 2;
}
Fungsi di atas dimaksudkan agar kalau dipanggil, variabel yang berkenaan dengan parameter aktual dapat diubah nilainya, masing-masing dinaikkan sebesar 2. Contoh
pemanggilan :
naikkan_nilai(&a, &b);
Perhatikan, dalam hal ini variabel a dan b harus ditulis diawali operator alamat (&) yang berarti menyatakan alamat variabel, sebab parameter fungsi dalam pendefinisian berupa pointer.
11. Pointer sebagai Keluaran Fungsi
Suatu fungsi dapat dibuat agar keluarannya berupa pointer. Misalnya, suatu fungsi menghasilkan keluaran berupa pointer yang menunjuk ke string nama_bulan, seperti pada contoh berikut.
char *nama_bulan(int n) {
static char *bulan[]= {“Kode bulan salah”, “Januari”, “Februari”, Maret”,
“April”, “Mei”, “Juni”, “Juli”, "Agustus”, “September”, “Oktober”, “Nopember”,“Desember”
};
return ((n<1 || n>12) ? bulan[0] : bulan[n]);
}
Pada definisi fungsi di atas,
char *nama_bulan()
menyatakan bahwa keluaran fungsi nama_bulan() berupa pointer yang menunjuk ke obyek char (atau string). Dalam fungsi nama_bulan(), mula-mula array bernama bulan dideklarasikan dan sekaligus diinisialisasi agar menunjuk sejumlah string yang menyatakan nama bulan. Di bagian akhir fungsi, pernyataan
return ( (n<1 || n>12) ? bulan[0] : bulan[n] );
menyatakan bahwa hasil fungsi berupa pointer yang menunjuk ke :
string “Kode bulan salah” (bulan[0]) jika masukan fungsi n<1 atau n>12
bulan[n] untuk n yang terletak antara 1 sampai dengan 12.
C. Skenario
Buatlah sebuah program untuk menukar isi variabel a dan variabel b menggunakan pointer.
1. Kegiatan 1 : Membuat program menggunakan c++
a. Langkah 1 : membuat fungsi untuk menukar nilai menggunakan pointer
void tukar(int *a, int *b) {
int c;
c = *a;
*a = *b;
*b = c;
}
b. Langkah 2 : deklarasi variabel yang akan ditukar
int x = 83;
int y = 47;
c. Langkah 3 : menampilkan isi variabel sebelum ditukar
cout<<”Nilai x sebelum ditukar = “<<x<<endl;
cout<<”Nilai y sebelum ditukar = “<<y<<endl;
d. Langkah 4 : memanggil fungsi untuk melakukan pertukaran nilai
tukar(&x, &y);
e. Langkah 5 : menampilkan isi variabel sebelum ditukar
cout<<”Nilai x setelah ditukar = “<<x<<endl;
cout<<”Nilai y setelah ditukar = “<<y<<endl;
2. Kegiatan 2 : kompilasi dan eksekusi program