Iklan
Apakah Anda menyadarinya atau tidak, sebagian besar program yang Anda gunakan memanfaatkan pointer dengan cara tertentu. Mungkin Anda pernah mengalami a NullPointerException dalam beberapa kasus. Sebagai seorang programmer, kode yang Anda tulis kemungkinan besar akan menggunakan pointer, bahkan jika Anda belum menerapkannya sendiri.
Hari ini saya akan menunjukkan kepada Anda bagaimana pointer bekerja, jadi Anda mungkin ingin memeriksa cara kerja array dan daftar Bagaimana Array dan Daftar Bekerja dengan PythonArray dan daftar adalah beberapa struktur data yang paling berguna dalam pemrograman - walaupun hanya sedikit orang yang menggunakannya secara maksimal. Baca lebih banyak untuk primer pemrograman. Artikel ini akan lebih berdasarkan teori dari biasanya, tetapi tetap dengan itu, pointer sangat kompleks!
Kompilasi Kode
Sebelum menggali pointer, Anda perlu memahami bagaimana kode dibangun dan dijalankan - mungkin Anda sudah tahu ini. Bagian ini akan memiliki pernyataan yang cukup umum - hal yang berlaku untuk mayoritas bahasa, tetapi belum tentu semuanya.
Mari kita kembali ke awal. Setiap komputer menggunakan biner Apa itu Biner? [Teknologi Dijelaskan]Mengingat bahwa biner sangat mendasar bagi keberadaan komputer, rasanya aneh bahwa kami tidak pernah membahas topik sebelumnya - jadi hari ini saya pikir saya akan memberikan tinjauan singkat tentang apa yang biner ... Baca lebih banyak , serangkaian yang dan nol yang membentuk teknologi modern seperti yang kita kenal. Sangat sulit untuk membuat kode apa pun dalam biner (file akan sangat membingungkan), karena ini adalah instruksi mentah yang diperlukan oleh Anda Unit pemrosesan utama atau CPU berfungsi Apa itu CPU dan Apa fungsinya?Akronim komputasi membingungkan. Apa itu CPU? Dan apakah saya memerlukan prosesor quad atau dual-core? Bagaimana dengan AMD, atau Intel? Kami di sini untuk membantu menjelaskan perbedaannya! Baca lebih banyak . Ini dikenal sebagai Kode Mesin.
Langkah selanjutnya dari kode mesin adalah Majelis. Ini adalah format yang bisa dibaca manusia. Meskipun masih rumit untuk diprogram, mungkin saja. Majelis terdiri dari serangkaian perintah sederhana untuk menjalankan tugas, dan dikenal sebagai a level rendah bahasa pemrograman. Dimungkinkan untuk menulis program yang kompleks, tetapi sulit untuk mengekspresikan konsep abstrak, dan membutuhkan banyak pertimbangan.
Banyak permainan video dan aplikasi berkinerja tinggi memiliki beberapa logika yang ditulis dalam perakitan, karena beberapa peningkatan kecepatan nyata dapat ditemukan jika Anda tahu apa yang Anda lakukan. Namun, untuk sebagian besar proyek pemrograman, Anda tidak perlu tahu perakitan apa pun.
Jadi jika kode mesin terlalu sulit untuk ditulis, dan perakitan terlalu sulit untuk diprogram, dengan apa Anda menulis kode? Di sinilah tempatnya level tinggi bahasa masuk Bahasa tingkat tinggi membuat program mudah ditulis. Anda dapat memprogram sesuatu yang menyerupai bahasa asli Anda, dan mudah untuk mengekspresikan algoritma yang kompleks. Anda mungkin pernah mendengar banyak bahasa tingkat tinggi (dan Anda pasti akan menggunakan program yang ditulis di dalamnya):
- DASAR
- C ++
- Pelat
Bahasa-bahasa ini sudah sangat tua sekarang, dan banyak dikembangkan pada awal 1950-an! Hampir setiap bahasa pemrograman modern adalah bahasa tingkat tinggi, termasuk PHP dan Python. Ada lebih banyak bahasa yang ditemukan setiap hari (walaupun mungkin sekarang sudah cukup), tetapi bagaimana tepatnya kode Anda masih berfungsi dengan baik jika komputer memerlukan kode mesin?
Di sinilah kompilasi masuk. Kompiler adalah program yang mengubah kode tingkat tinggi Anda menjadi bentuk yang dapat dieksekusi. Ini bisa menjadi bahasa tingkat tinggi yang lain, tetapi biasanya itu adalah rakitan. Beberapa bahasa (seperti Python atau Java) mengonversi kode Anda ke tahap perantara yang disebut bytecode. Ini perlu dikompilasi lagi di kemudian hari, yang biasanya dilakukan atas permintaan, seperti ketika program berjalan. Ini dikenal sebagai tepat waktu kompilasi, dan ini cukup populer.
Manajemen memori
Sekarang setelah Anda mengetahui cara kerja bahasa pemrograman, mari kita lihat manajemen memori dalam bahasa tingkat tinggi. Untuk contoh-contoh ini, saya akan menggunakan kode semu - kode yang ditulis tidak dalam bahasa tertentu, tetapi digunakan untuk menunjukkan konsep daripada sintaks yang tepat. Hari ini, ini sebagian besar akan menyerupai C ++ sebagai bahasa tingkat tinggi terbaik (menurut saya).
Untuk bagian ini, ini akan membantu jika Anda memiliki pemahaman tentang cara kerja RAM Panduan Cepat dan Kotor untuk RAM: Yang Perlu Anda KetahuiRAM adalah komponen penting dari setiap komputer, tetapi bisa membingungkan. Kami memecahnya dalam istilah yang mudah dipahami yang akan Anda pahami. Baca lebih banyak .
Sebagian besar bahasa memiliki variabel - wadah yang menyimpan beberapa data. Anda harus secara eksplisit mendefinisikan tipe data. Beberapa bahasa yang diketik secara dinamis seperti Python atau PHP menangani ini untuk Anda, tetapi mereka masih harus melakukannya.
Katakanlah Anda memiliki variabel:
int myNumber;
Kode ini mendeklarasikan variabel yang disebut nomor saya, dan memberinya tipe data bilangan bulat. Setelah dikompilasi, komputer mengartikan perintah ini sebagai:
“Temukan beberapa memori kosong, dan pesan ruang yang cukup besar untuk menyimpan integer”
Setelah perintah ini dieksekusi, sedikit memori itu tidak dapat digunakan oleh program lain. Itu belum mengandung data apa pun, tetapi dicadangkan untuk variabel myNumber Anda.
Sekarang berikan nilai ke variabel Anda:
myNumber = 10;
Untuk menyelesaikan tugas ini, komputer Anda mengakses lokasi memori yang dicadangkannya, dan mengubah nilai apa pun yang disimpan di sana, ke nilai baru ini.
Sekarang, ini semua baik dan bagus, tetapi bagaimana lokasi memori tidak dapat diselamatkan? Jika program mencadangkan semua memori yang mereka suka, RAM akan segera terisi - yang akan menghasilkan sangat sistem lambat.
Untuk menghindari kemungkinan masalah ini, banyak bahasa menerapkan a pengumpul sampah, Digunakan untuk menghancurkan variabel (dan karena itu melepaskan lokasi memori yang dicadangkan) yang telah hilang keluar dari ruang lingkup.
Anda mungkin bertanya-tanya apa ruang lingkup itu dan mengapa itu sangat penting. Lingkup mendefinisikan batasan dan umur variabel atau memori apa pun yang digunakan oleh suatu program. Suatu variabel “di luar ruang lingkup” ketika tidak dapat lagi diakses oleh kode apa pun (saat itulah pemungut sampah masuk). Ini sebuah contoh:
function maths () {int firstNumber = 1; } int secondNumber = 2; print (firstNumber + secondNumber); // tidak akan bekerja
Contoh ini tidak akan dikompilasi. Variabel nomor pertama berada di dalam matematika fungsi, jadi itu ruang lingkupnya. Itu tidak dapat diakses dari luar fungsi yang telah dideklarasikan. Ini adalah konsep pemrograman yang penting, dan memahami adalah penting untuk bekerja dengan pointer.
Cara menangani memori ini disebut tumpukan. Begitulah cara sebagian besar program bekerja. Anda tidak perlu memahami pointer untuk menggunakannya, dan itu terstruktur dengan cukup baik. Kerugian dari tumpukan adalah kecepatan. Karena komputer harus menetapkan memori, melacak variabel, dan menjalankan pengumpulan sampah, ada overhead kecil. Ini bagus untuk program yang lebih kecil, tetapi bagaimana dengan tugas kinerja tinggi, atau aplikasi data berat?
Masukkan: pointer.
Pointer
Di permukaan, pointer terdengar sederhana. Referensi mereka (arahkan ke) lokasi dalam memori. Ini mungkin tidak tampak berbeda dengan variabel "biasa" di tumpukan, tapi percayalah, ada perbedaan besar. Pointer disimpan di tumpukan. Ini adalah kebalikan dari tumpukan - ini kurang terorganisir, tetapi jauh lebih cepat.
Mari kita lihat bagaimana variabel ditugaskan pada stack:
int numberOne = 1; int numberTwo = numberOne;
Ini adalah sintaksis sederhana; Variabel nomor dua berisi nomor satu. Nilai ini disalin selama penugasan dari nomor satu variabel.
Jika Anda ingin mendapatkan alamat memori variabel, alih-alih nilainya, Anda harus menggunakan tanda ampersand (&). Ini disebut alamat operator, dan merupakan bagian penting dari alat penunjuk Anda.
int numberOne = 1; int numberTwo = & numberOne;
Sekarang nomor dua variabel poin ke lokasi memori, alih-alih menyalin nomor satu ke lokasi memori baru itu sendiri. Jika Anda ingin menampilkan variabel ini, itu tidak akan menjadi nomor satu (meskipun itu disimpan di lokasi memori). Ini akan menampilkan lokasi memorinya (mungkin sekitar 2167, meskipun bervariasi tergantung pada sistem, dan RAM yang tersedia). Untuk mengakses nilai yang disimpan dalam pointer, alih-alih lokasi memori, Anda harus dereference pointer. Ini mengakses nilai secara langsung, yang akan menjadi nomor satu dalam hal ini. Beginilah cara Anda merujuk referensi:
int numberTwo = * numberOne;
Itu operator dereference adalah tanda bintang (*).
Ini bisa menjadi konsep yang sulit untuk dipahami, jadi mari kita ulangi lagi:
- Itu alamat operator (&) menyimpan alamat memori.
- Itu operator dereference (*) mengakses nilai.
Sintaks berubah sedikit ketika mendeklarasikan pointer:
int * myPointer;
Tipe data dari int di sini mengacu pada tipe data pointer poin untuk, dan bukan tipe dari pointer itu sendiri.
Sekarang setelah Anda tahu apa itu pointer, Anda bisa melakukan beberapa trik yang sangat rapi dengannya! Ketika memori digunakan, sistem operasi Anda mulai secara berurutan. Anda dapat menganggap RAM sebagai lubang merpati. Banyak lubang untuk menyimpan sesuatu, hanya satu yang bisa digunakan sekaligus. Perbedaannya di sini adalah, lubang-lubang merpati ini semuanya bernomor. Saat menetapkan memori, sistem operasi Anda mulai dari angka terendah, dan bekerja. Itu tidak akan pernah melompat di antara angka acak.
Saat bekerja dengan pointer, jika Anda telah menetapkan array, Anda dapat dengan mudah menavigasi ke elemen berikutnya dengan menambah pointer Anda.
Di sinilah mulai menarik. Saat Anda meneruskan nilai ke fungsi (menggunakan variabel yang disimpan di tumpukan), nilai-nilai ini akan disalin ke fungsi Anda. Jika ini adalah variabel besar, program Anda sekarang menyimpannya dua kali. Ketika fungsi Anda selesai, Anda mungkin perlu cara untuk mengembalikan nilai-nilai ini. Fungsi umumnya hanya dapat mengembalikan satu hal - jadi bagaimana jika Anda ingin mengembalikan dua, tiga, atau empat hal?
Jika Anda melewatkan pointer ke fungsi Anda, hanya alamat memori yang disalin (yang kecil). Ini menghemat banyak kerja CPU Anda! Mungkin pointer Anda menunjuk ke array gambar yang sangat besar - tidak hanya fungsi Anda dapat bekerja pada titik yang sama persis data yang disimpan di lokasi memori yang sama persis, tetapi setelah selesai, tidak perlu kembali apa pun. Rapi!
Anda harus sangat berhati-hati. Pointer masih bisa keluar dari ruang lingkup dan dikumpulkan oleh pengumpul sampah. Nilai-nilai yang tersimpan dalam memori, bagaimanapun, tidak dikumpulkan. Ini disebut kebocoran memori. Anda tidak dapat lagi mengakses data (karena pointer telah dihancurkan), tetapi masih menggunakan memori. Ini adalah alasan umum mengapa banyak program macet, dan bisa gagal secara spektakuler jika ada sejumlah besar data. Sebagian besar waktu, sistem operasi Anda akan mematikan program Anda jika Anda memiliki kebocoran besar (menggunakan lebih banyak RAM daripada sistem miliki), tetapi itu tidak diinginkan.
Pointer debugging bisa menjadi mimpi buruk, terutama jika Anda bekerja dengan sejumlah besar data, atau bekerja dalam loop. Kerugian dan kesulitan mereka untuk memahami benar-benar sebanding dengan imbalan yang Anda peroleh dalam kinerja. Meskipun ingat, mereka mungkin tidak selalu diminta.
Itu untuk hari ini. Saya harap Anda telah mempelajari sesuatu yang bermanfaat tentang topik yang kompleks. Tentu saja, kami belum membahas semua yang perlu diketahui - ini adalah topik yang sangat kompleks. Jika Anda tertarik untuk belajar lebih banyak, saya sangat merekomendasikan C ++ dalam 24 Jam.
Jika ini agak rumit, lihatlah panduan kami untuk bahasa pemrograman yang paling mudah 6 Bahasa Pemrograman yang Paling Mudah Dipelajari untuk PemulaMempelajari program adalah tentang menemukan bahasa yang tepat, sama halnya dengan proses edifikasi. Berikut adalah enam bahasa pemrograman termudah untuk pemula. Baca lebih banyak .
Apakah Anda mempelajari cara kerja pointer hari ini? Apakah Anda punya tips dan trik yang ingin Anda bagikan dengan programmer lain? Langsung ke komentar dan bagikan pemikiran Anda di bawah ini!
Joe adalah lulusan Ilmu Komputer dari University of Lincoln, Inggris. Dia adalah pengembang perangkat lunak profesional, dan ketika dia tidak terbang drone atau menulis musik, dia sering ditemukan mengambil foto atau memproduksi video.