Pointer
Tujuan Praktikum :
1.Dapat mengernal dan memahami struktur data pointer.
2.Dapat mengiplementasikan pointer ke dalam bahasa c/c++.
Dasar Teori :
Untuk program C++, memori komputer sama dengan rangkaian sel memori, masing-masing satu byte, dan masing-masing memiliki alamat yang unik. Sel memori single-byte ini diperintahkan dengan cara yang memungkinkan representasi data lebih besar dari satu byte untuk menempati sel memori yang memiliki alamat berturut-turut.
Dengan cara ini, setiap sel dapat dengan mudah ditemukan di memori dengan alamat yang unik. Sebagai contoh, sel memori dengan alamat 1776 selalu seketika mengikuti setelah sel dengan alamat 1775 dan mendahului satu angka menjadi 1777, dan persis seribu sel setelah 776 dan tepat seribu sel sebelum 2776.
Ketika sebuah variabel dideklarasikan, memori yang dibutuhkan untuk menyimpan nilainya diberikan lokasi tertentu di memori (alamat memori-nya). Umumnya, program C ++ tidak secara aktif menentukan alamat memori yang tepat dimana variabel-variabelnya disimpan. Untungnya, tugas itu diserahkan kepada lingkungan di mana program dijalankan - umumnya, sistem operasi yang menentukan lokasi memori tertentu pada saat runtime. Namun, mungkin berguna bagi sebuah program untuk dapat memperoleh alamat sebuah variabel selama runtime untuk mengakses sel data yang berada pada posisi tertentu relatif terhadapnya.
Operator Deference (&)
Operator ini biasanya disebut dengan address of atau operator alamat. Dengan menggunakan operator deference (&) ini, suatu variabel akan menghasilkan alamat memori. Sebagai contoh:foo = &myvar;
Ini akan menetapkan alamat variabel myvar menjadi foo; Dengan mendahului nama variabel myvar dengan alamat-operator (&), kita tidak lagi menugaskan konten dari variabel itu sendiri untuk foo, tapi alamatnya.
Alamat sebenarnya dari variabel dalam memori tidak dapat diketahui sebelum runtime, namun mari kita asumsikan, untuk membantu mengklarifikasi beberapa konsep, myvar ditempatkan saat runtime di alamat memori 1776.
Dalam kasus ini, pertimbangkan fragmen kode berikut ini:
mayvar = 25;
foo = &myvar;
bar = myvar;
foo = &myvar;
bar = myvar;
Nilai yang terkandung dalam setiap variabel setelah eksekusi ini ditunjukkan pada diagram berikut:
Pertama, kita telah menetapkan nilai 25 untuk myvar (sebuah variabel yang alamatnya di memori kita asumsikan 1776).
Pernyataan kedua menugaskan alamat myvar, yang telah kita anggap 1776.
Akhirnya, pernyataan ketiga, memberikan nilai yang terkandung dalam myvar to bar. Ini adalah operasi penugasan standar.
Variabel yang menyimpan alamat variabel lain (seperti foo pada contoh sebelumnya) adalah apa yang di C++ disebut pointer. Pointer adalah fitur yang sangat kuat dari bahasa yang memiliki banyak kegunaan dalam pemrograman tingkat rendah. Beberapa saat kemudian, kita akan melihat bagaimana cara mendeklarasikan dan menggunakan petunjuk.
Operator Reference (*)
Operator ini biasanya disebut value pointed by. Dengan menggunakan operator ini, kita dapat mengakses secara langsung nilai yang terdapat pada suatu alamat memori.Sebuah variabel yang menyimpan alamat variabel lain disebut pointer. Pointer dikatakan "menunjuk ke" variabel yang alamatnya mereka simpan.
Properti penunjuk yang menarik adalah dapat yang digunakan untuk mengakses variabel yang akan tunjuk secara langsung. Hal ini dilakukan dengan mendahului nama penunjuk dengan operator dereference (*). Operator itu sendiri dapat dibaca sebagai "nilai yang ditunjukkan oleh".
Oleh karena itu, berikut dengan nilai contoh sebelumnya, berikut pernyataannya
baz = *foo;
Pernyataan ini bisa dibaca sebagai: "baz sama dengan nilai yang ditunjukkan oleh foo", dan pernyataan tersebut benar-benar akan menetapkan nilai 25 menjadi baz, karena foo adalah 1776, dan nilai yang ditunjukkan pada 1776 (berikut contoh di atas) adalah 25 .
Penting untuk membedakan dengan jelas bahwa foo mengacu pada nilai 1776, sedangkan * foo (dengan tanda bintang * mendahului identifier) mengacu pada nilai yang tersimpan di alamat 1776, yang dalam hal ini adalah 25. Perhatikan perbedaan termasuk atau tidak termasuk Operator dereference (saya telah menambahkan sebuah komentar penjelasan tentang bagaimana masing-masing dari kedua ungkapan ini dapat dibaca):
baz = foo; // baz equal to foo (1776)
baz = *foo; // baz equal to value pointed to by foo (25)
baz = *foo; // baz equal to value pointed to by foo (25)
Oleh karena itu, operator referensi dan dereferensi saling melengkapi:
& Adalah alamat operator, dan bisa dibaca hanya sebagai "alamat"
* Adalah operator dereference, dan dapat dibaca sebagai "nilai yang ditunjukkan oleh"
Dengan demikian, keduannya memiliki semacam makna yang berlawanan: Alamat yang diperoleh dengan & dapat dereferenced dengan *.
Sebelumnya, kami melakukan dua operasi penugasan berikut ini:
myvar = 25;
foo = &myvar;
foo = &myvar;
Tepat setelah dua pernyataan ini, semua ungkapan berikut akan memberi hasil yang benar :
myvar == 25
&myvar == 1776
foo == 1776
*foo == 25
&myvar == 1776
foo == 1776
*foo == 25
Ungkapan pertama cukup jelas, mengingat operasi penugasan yang dilakukan pada myvar adalah myvar = 25. Yang kedua menggunakan alamat-operator (&), yang mengembalikan alamat myvar, yang kita anggap memiliki nilai 1776. Yang ketiga agak jelas, karena ungkapan kedua benar dan operasi penugasan dilakukan pada Foo adalah foo = & myvar Ungkapan keempat menggunakan operator dereference (*) yang bisa dibaca sebagai "nilai yang ditunjukkan oleh", dan nilai yang ditunjukkan oleh foo memang 25.
Jadi, setelah semua itu, Anda mungkin juga menyimpulkan bahwa selama alamat yang ditunjuk oleh foo tetap tidak berubah, ungkapan berikut juga benar:
*foo == myvar
Mendeklarasikan pointer
Karena kemampuan penunjuk untuk secara langsung mengacu pada nilai yang ditunjukkannya, pointer memiliki sifat yang berbeda saat mengarah ke karakter daripada saat mengarah ke int atau float. Setelah dereferenced, dan jenisnya perlu diketahui. Untuk itu, deklarasi pointer perlu menyertakan tipe data yang akan menunjuk pointer.Deklarasi pointer mengikuti sintaks ini:
tipe_data *nama_variabel_pointer;
Dimana tipe adalah tipe data yang ditunjukkan oleh pointer. Tipe ini bukan tipe dari pointer itu sendiri, tapi tipe data pointer menunjuk ke. Sebagai contoh:
int * nomor;
char * karakter;
double * desimal;
char * karakter;
double * desimal;
Pointer Pada Array
Inisialisasi pada konsep array yang terkait dengan pointer. Sebenarnya, array bekerja sangat mirip pointer ke elemen pertama, dan sebenarnya sebuah array dapat secara implisit dikonversi ke pointer dari tipe yang tepat. Misalnya, pertimbangkan kedua deklarasi ini:int myarray [20];
int *mypointer;
int *mypointer;
Operasi penugasan berikut ini akan berlaku:
mypointer = myarray;
Setelah itu, mypointer dan myarray akan setara dan memiliki sifat yang sangat mirip. Perbedaan utama adalah bahwa mypointer dapat diberi alamat yang berbeda, sedangkan myarray tidak dapat ditugaskan apapun, dan akan selalu mewakili blok yang sama dari 20 elemen tipe int. Oleh karena itu, penugasan berikut tidak akan berlaku:
myarray = mypointer;
Praktikum 7.1
Buatlah program yang memindahkan isi variabel awal menuju ke variabel tujuan yang ditunjuk serta menampilkan alamat alokasi memori sebelum dipindahkan ke variabel tujuan
Syntaxnya :
#include <iostream.h> // lan-balon.blogspot.co.id
#include <conio.h>
main(void)
{
int x, y; //x dan y bertipe int
int *px; //px pointer yang menunjuk objek
x = 87;
px = &x; //px berisi alamat dari x
y = *px; //y berisi nilai yang dituju px
cout << "Alamat x Pada Memori \t\t= " << &x << endl;
cout << "Isi px \t\t\t\t= " << px << endl;
cout << "Isi \t\t\t\t= " << x << endl;
cout << "Nilai yang ditunjuk oleh px \t= " << *px << endl;
cout << "Alamat y pada Memori \t\t= " << &y << endl;
cout << "Nilai y \t\t\t= " << y << endl;
getch();
}
Penjelasannya :
Program ini akan memindahkan isi variabel satu ke variabel lainnya menggunakan pointer dengan operator reference(*), dan akan menampilkan alamat lokasi penyimpanan menggunakan pointer dengan operator desference(&).
Terdapat sebuah array yang memiliki hanya satu elemen yaitu 5 dan tempatkan pada indeks ke 0 dalam array, sementara alamat indeks selebihnya bernilai 0. Buatlah program yang dapat mengisi indeks yang lain melalui nilai elemen indeks ke 0 (contoh penyelesaian kasus diatas pada program dibawah ini adalah statis).
Syntaxnya :
#include <iostream.h> // lan-balon.blogspot.co.id
#include <conio.h>
int main()
{
int x[5], *p, k;
p = x;
x[0] = 5; //x[0] diisi dengan 5 sehingga x[0] = 5
x[1] = x[0]; //x[1] diisi dengan x[0] sehingga x[1] = 5
x[2] = *p + 2; //x[2] diisi dengan x[0] + 2 sehingga x[2] = 7
x[3] = *(p + 1) - 3; //x[3] diisi dengan x[1] - 3 sehingga x[3] = 2
x[4] = *(x + 2); //x[4] diisi dengan x[2] sehingga x[4] = 7
cout << "Array setelah diisi = " << endl;
cout << endl;
for (k = 0; k < 5; k++)
{
cout << "x [" << k << "] = " << x[k] << endl;
}
getch();
return 0;
}
Penjelasannya :
Program ini di buat dan terdapat 3 variabel yaitu p = x yaitu 5, variabel k digunakan untuk perulangan, variabel array x, dan terdapat fungsi pointer.
Latihan 7.3
#include <stdio.h> // lan-balon.blogspot.co.id
//pemanggilan parameter
void tambahsepuluh (int *);
void ubahkarakter (char *);
int main()
{//penetapan nilai awal
int bilangan = 4;
char sesuatu = 'S';
//menampilkan isi variabel sebelum fungsi dipanggil
printf ("Bilangan sebelum fungsi dipanggil \t: %d\n", bilangan);
printf ("Nilai sesuatu sebelum fungsi dipanggil\t: %c\n\n", sesuatu);
//pemanggilan fungsi parameter dengan pointer desference
tambahsepuluh (&bilangan);
ubahkarakter(&sesuatu);
//menampilkan isi variabel setelah fungsi dipanggil
printf ("Bilangan setelah fungsi dipanggil \t: %d\n", bilangan);
printf ("Nilai sesuatu setelah Fungsi dipanggil\t: %c\n", sesuatu);
return 0;
}
void tambahsepuluh (int *bil) //parameter bilangan
{
*bil = *bil + 10; //dilakukan penjumlahan dengan penunjukan isi variabel + 10
}
void ubahkarakter (char *kar)
{
char karakter = 'H'; //mengubah isi variabel dengan huruf H
*kar = karakter;
}
Penjelasannya :
Program ini di Buat dengan menggunakan parameter fungsi Terdapat dua tipe data yaitu intejer dengan nama variabel bilangan dan karakter ..
0 Comment to "Modul 7 - Pointer"
Posting Komentar