Ini bukan soalan tipikal pembenci penunjuk, tetapi soalan yang sangat menarik.
Penunjuk ialah konsep yang hebat, tetapi itulah ia: konsep. Jadi mengapa pengkompil C dicipta dengan sekeping logik dan sintaks yang terpencil khusus untuk penunjuk?
Jangan salah faham, saya suka peluang yang penunjuk berikan kepada kita dan sintaks semasanya. Ia adalah ciri yang sangat penting, setelah mencapai evolusi struktur data dinamik, objek dan kelas, perkongsian memori berbilang benang, kebolehubahan objek, pertindihan nilai redundan rendah dan banyak lagi.
Tetapi jika anda bayangkan peristiwa penciptaan C, petunjuk sebagai masa kini nampaknya idea yang jauh lebih mengagumkan daripada konsep pertama yang intuitif. Mari kita lihat dengan lebih mendalam apa yang saya maksudkan.
Jika anda melihat pada struktur penunjuk, ia pada asasnya adalah panjang yang tidak ditandatangani (aka 4[32bit system] atau 8 bait dalam ingatan). Perkara yang memisahkan penunjuk daripada long tidak bertanda ialah ciri khusus penuding.
Penunjuk mempunyai sintaks pengisytiharan sendiri dan mempunyai pengendali khasnya: penyahrujuk.
int a = 5; int *ptr = &a; //declaration int value = *ptr; //dereference
Tetapi mari kita bayangkan, bahawa ini tidak pernah dicipta. Maka perkara berikut hanya boleh dilakukan dengan mudah jika ciri penyahrujukan hanya dikaitkan dengan mana-mana jenis integer:
int a = 5; unsigned long adress = &a; int value = *adress;
Dalam kes itu, anda juga boleh melakukan perkara seperti ini:
int firstIntInMemory = *(0); //manually dereferences (4bytes at) adress 0`
Bercakap tentang penghurai, ini sama sekali bukan sintaks yang bercanggah kerana bintang sebagai derefrencer ialah pengendali unari manakala bintang sebagai pendarab aritmetik sentiasa menjadi pengendali binari.
Pengendali dereferencing fiksyen ini seperti yang saya nyatakan di atas adalah intipati mentah konsep penunjuk. Membandingkan ini dengan pelaksanaan sebenar semasa menjadikan soalan utama sangat menarik untuk difikirkan. Mungkin terdapat begitu banyak hasil.
Satu-satunya perkara istimewa yang dilakukan oleh aritmetik penunjuk ialah mengambil saiz jenis mengikut pengiraan. Apabila saya mempunyai tatasusunan, dan saya ingin mendapatkan elemen kedua, saya hanya menambah 1 pada penunjuk. Jika ia adalah penunjuk int, ini secara tersirat sebenarnya akan menambah nilai 4 pada alamat (jika sizeof(int) == 4 pada sistem anda):
int arr[5] = {1,2,3,4,5}; int second = *(arr + 1);
Tetapi jujurlah, perkara berikut sebenarnya lebih logik jika anda berfikir secara intuitif tentang ingatan:
int arr[5] = {1,2,3,4,5}; int second = *(arr + sizeof(int));
Dan ini hanyalah aritmetik integer piawai. Jika anda melihatnya dengan cara ini, sebenarnya tidak ada sebab untuk mencipta aritmetik penunjuk sama sekali.
Sudah tentu, sintaks '*' menjadikan penggunaan yang dimaksudkan lebih jelas. Jika anda melihatnya, anda dengan serta-merta mengetahui bahawa pembolehubah ini digunakan untuk manipulasi ingatan. Juga setiap fungsi perpustakaan manupulasi memori direka bentuk untuk penunjuk.
Tetapi tetap, jika ia tidak pernah dicipta, dan sebaliknya kami mempunyai rindu yang tidak boleh ditandatangani yang boleh dirujuk ini, orang ramai baru sahaja menghasilkan reka bentuk dan konvensyen penamaan, seperti menambahkan pengecam pembolehubah penuding dengan akhiran '_p'. Dan perpustakaan manipulasi ingatan hanya akan berkembang di sekitar ini.
Sebenarnya, jika anda memikirkannya, C hanya boleh bertahan dengan cara yang sama seperti ia hidup sekarang jika penunjuk tidak pernah dicipta sebagai ciri bahasa. Ia hanya akan dicipta sebagai konsep oleh pengaturcara, berfungsi sama seperti cara ia wujud pada masa ini.
Saya dapati cerita ini menarik untuk disiasat lebih mendalam.
Mengapa C mencipta penunjuk?
Adakah itu hanya sebab yang kami jangkakan: ketekalan, kejelasan dan keselamatan terhadap penyalahgunaan nyahrefransi?
Atau adakah terdapat sebab yang lebih mendalam dan logik yang jauh lebih kompleks daripada cara saya membincangkan petunjuk dalam siaran ini, yang menjadikannya lebih cekap daripada melakukan perkara yang sama dengan integer tujuan umum?
Atas ialah kandungan terperinci Soalan yang tidak diucapkan: \'Mengapa petunjuk wujud?\'. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!