-->

Pointer Pemrograman C/C++ (Struktur Data - Modul 7)



Pointer

Pointer dalam bahasa Indonesia berarti petunjuk. Pointer merupakan variabel yang menyimpan atau menunjuk suatu alamat memori dan bukan menyimpan suatu nilai. Dengan demikian pointer tidak berhubungan langsung dengan data actual, dengan kata lain variabel pointer hanya berisi alamat variabel lain yang berisi data tertentu.

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;

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.

Perbedaan utama antara pernyataan kedua dan ketiga adalah kemunculan alamat-operator (&).

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)

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;

Tepat setelah dua pernyataan ini, semua ungkapan berikut akan memberi hasil yang benar :

myvar == 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;

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;

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;

Contoh soal :
1. Praktikum 7.1
2. Praktikum 7.2
3. Praktikum 7.3
4. Latihan 7.1
5. Latihan 7.2
6. Post Test 7.1


7. Post Test 7.2 


Referensi http://www.cplusplus.com/doc/tutorial/pointers/

Berlangganan update artikel terbaru via email:

0 Response to "Pointer Pemrograman C/C++ (Struktur Data - Modul 7)"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel