Pendapat saya yang sangat pribadi adalah bahwa gambar dengan panah mengarah ke sini atau itu membuat pointer lebih sulit untuk dipahami. Itu memang membuat mereka tampak seperti entitas abstrak dan misterius. Mereka tidak.
Seperti semua hal lain di komputer Anda, pointer adalah angka . Nama "pointer" hanyalah cara biasa untuk mengatakan "variabel yang berisi alamat".
Oleh karena itu, izinkan saya mengaduk berbagai hal dengan menjelaskan bagaimana komputer sebenarnya bekerja.
Kami memiliki int
, ia memiliki nama i
dan nilai 5. Ini disimpan dalam memori. Seperti semua yang tersimpan di memori, ia perlu alamat, atau kami tidak akan dapat menemukannya. Katakanlah i
berakhir di alamat 0x12345678 dan temannya j
dengan nilai 6 berakhir tepat setelah itu. Dengan asumsi CPU 32-bit di mana int adalah 4 byte dan pointer 4 byte, maka variabel disimpan dalam memori fisik seperti ini:
Address Data Meaning
0x12345678 00 00 00 05 // The variable i
0x1234567C 00 00 00 06 // The variable j
Sekarang kita ingin menunjukkan variabel-variabel ini. Kami membuat satu pointer ke int int* ip1
,, dan satu int* ip2
. Seperti semua yang ada di komputer, variabel pointer ini dialokasikan di suatu tempat di memori juga. Mari kita asumsikan mereka berakhir di alamat yang berdekatan berikutnya dalam memori, segera setelah itu j
. Kami menetapkan pointer berisi alamat variabel yang sebelumnya dialokasikan: ip1=&i;
("salin alamat i ke ip1") dan ip2=&j
. Apa yang terjadi di antara keduanya adalah:
Address Data Meaning
0x12345680 12 34 56 78 // The variable ip1(equal to address of i)
0x12345684 12 34 56 7C // The variable ip2(equal to address of j)
Jadi yang kami dapatkan hanyalah beberapa byte memori yang berisi angka. Tidak ada panah mistis atau magis di mana pun terlihat.
Bahkan, hanya dengan melihat dump memori, kami tidak dapat memastikan apakah alamat 0x12345680 berisi int
atau int*
. Perbedaannya adalah bagaimana program kami memilih untuk menggunakan konten yang disimpan di alamat ini. (Tugas program kami sebenarnya hanya memberi tahu CPU apa yang harus dilakukan dengan angka-angka ini.)
Kemudian kami menambahkan satu lagi tipuan dengan int** ipp = &ip1;
. Sekali lagi, kami hanya mendapatkan sepotong memori:
Address Data Meaning
0x12345688 12 34 56 80 // The variable ipp
Polanya memang tidak asing lagi. Namun sepotong 4 byte lainnya berisi angka.
Sekarang, jika kita memiliki memori dump RAM fiksi kecil di atas, kita bisa secara manual memeriksa di mana titik petunjuk ini. Kami mengintip apa yang disimpan di alamat ipp
variabel dan menemukan konten 0x12345680. Yang tentu saja alamat tempat ip1
penyimpanannya. Kita dapat pergi ke alamat itu, memeriksa isinya, dan menemukan alamatnya i
, dan akhirnya kita bisa pergi ke alamat itu dan menemukan nomor 5.
Jadi jika kita mengambil konten ipp *ipp
,, kita akan mendapatkan alamat variabel pointer ip1
. Dengan menulis *ipp=ip2
kita menyalin IP2 ke IP1, itu setara dengan ip1=ip2
. Dalam kedua kasus kita akan mendapatkan
Address Data Meaning
0x12345680 12 34 56 7C // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
(Contoh-contoh ini diberikan untuk CPU big endian)
ipp
ketika mendefinisikannya, jadi pertanyaan Anda selesai ;-)