Mengikuti komentar ini , saya sudah mencoba ke google mengapa, tetapi google-fu saya gagal.
Komentar dari tautan:
[...] Tetapi yang penting adalah bahwa array dan pointer adalah hal yang berbeda dalam C.
Dengan anggapan Anda tidak menggunakan ekstensi kompiler, Anda umumnya tidak bisa meneruskan array itu sendiri ke suatu fungsi, tetapi Anda bisa melewatkan sebuah pointer, dan mengindeks sebuah pointer seolah-olah itu array.
Anda secara efektif mengeluh bahwa pointer tidak memiliki panjang terpasang. Anda harus mengeluh bahwa array tidak dapat dilewatkan sebagai argumen fungsi, atau array menurun ke pointer secara implisit.
Jawaban:
Dugaan pertama saya untuk alasannya adalah semata-mata karena alasan kinerja dan penghematan memori, dan juga untuk kemudahan implementasi kompiler (terutama untuk jenis komputer pada saat C ditemukan). Melewati array besar "berdasarkan nilai" tampaknya memiliki dampak besar pada stack, perlu operasi copy array penuh untuk setiap pemanggilan fungsi, dan mungkin kompiler harus lebih pintar untuk menampilkan kode perakitan yang benar (meskipun poin terakhir masih bisa diperdebatkan) . Akan lebih sulit untuk memperlakukan array yang dialokasikan secara dinamis dengan cara yang sama dengan array yang dialokasikan secara statis (dari sudut pandang sintaksis bahasa).
EDIT: setelah membaca beberapa bagian dari link ini , saya pikir alasan sebenarnya (dan alasan mengapa array di structs diperlakukan sebagai jenis nilai, sedangkan array tunggal tidak) adalah kompatibilitas ke C pendahulunya B . Berikut ini kutipan dari Dennis Ritchie:
sumber
struct Foo { int array[N]; }
dapat dilewati dengan nilai. Dan bit terakhir tentang memperlakukan alokasi dinamis dan statis sama nampak mencurigakan (sebuah array dalam arti ketat selalu mencakup ukuran, konsep pemersatu untuk hal-hal seperti array indexing adalah pointer digabungkan dengan peluruhan array-to-pointer), bisakah Anda menguraikan?Komputer mini PDP dengan hanya 8 kB memori tidak dapat mengalokasikan tumpukan yang sangat besar. Jadi, pada mesin seperti itu, seseorang harus berhati-hati dalam desain bahasa (atau evolusi) untuk dapat meminimalkan apa yang perlu dilakukan di stack untuk penggunaan panggilan subrutin umum yang diharapkan. C masih digunakan saat ini untuk memprogram sistem tertanam yang sangat terbatas memori (beberapa kB), sehingga trade-off biasanya bagus.
Pada arsitektur prosesor yang memiliki register sangat sedikit, melewatkan array dengan pointer daripada dengan nilai lebih sering memungkinkan register untuk digunakan sebagai optimasi panggilan subrutin.
sumber