Mengapa C menggunakan tanda bintang untuk pointer?
Sederhananya - karena B melakukannya.
Karena memori adalah array linier, dimungkinkan untuk menafsirkan nilai dalam sel sebagai indeks dalam array ini, dan BCPL memasok operator untuk tujuan ini. Dalam bahasa aslinya itu dieja rv
, dan kemudian !
, sementara B menggunakan unary *
. Jadi, jika p
ada sel yang berisi indeks (atau alamat), atau penunjuk ke) sel lain, *p
mengacu pada konten sel yang ditunjuk, baik sebagai nilai dalam ekspresi atau sebagai target penugasan.
Dari Perkembangan Bahasa C
Itu dia. Pada titik ini, pertanyaannya sama tidak menariknya dengan "mengapa python 3 digunakan .
untuk memanggil metode? Mengapa tidak ->
?" Yah ... karena Python 2 digunakan .
untuk memanggil metode.
Jarang bahasa ada dari ketiadaan. Itu memiliki pengaruh dan didasarkan pada sesuatu yang datang sebelumnya.
Jadi, mengapa B tidak digunakan !
untuk derefrencing pointer seperti BCPL pendahulunya lakukan?
Nah, BCPL agak bertele-tele. Alih-alih &&
atau ||
BCPL digunakan logand
dan logor
. Ini karena sebagian besar keyboard tidak memiliki ∧
atau ∨
kunci dan tidak sama sebenarnya adalah kata NEQV
(lihat Manual Referensi BCPL ).
B tampaknya sebagian terinspirasi untuk memperketat sintaks daripada memiliki kata-kata panjang untuk semua operator logis ini yang sering dilakukan oleh programmer. Dan dengan demikian !
untuk dereferensi menjadi *
sehingga !
dapat digunakan untuk negasi logis. Perhatikan ada perbedaan antara *
operator unary dan *
operator biner (multiplikasi).
Nah, bagaimana dengan pilihan lain , seperti ->
?
Itu ->
diambil untuk gula sintaksis sekitar derefrences lapangan struct_pointer->field
yang(*struct_pointer).field
Opsi lain seperti <-
bisa membuat parsing yang ambigu. Sebagai contoh:
foo <- bar
Apakah itu dibaca sebagai:
(foo) <- (bar)
atau
(foo) < (-bar)
Membuat operator unary yang terdiri dari operator biner dan operator unary lain sangat mungkin mengalami masalah karena operator unary kedua mungkin merupakan awalan untuk ekspresi lain.
Lebih jauh lagi, penting untuk mencoba menjaga hal-hal yang diketik sesering mungkin. Aku benci harus menulis:
int main(int argc, char->-> argv, char->-> envp)
Ini juga menjadi sulit dibaca.
Karakter lain mungkin telah dimungkinkan (yang @
tidak digunakan sampai Objective C menggunakannya ). Meskipun sekali lagi, ini pergi ke inti 'C menggunakan *
karena B melakukannya'. Kenapa B tidak digunakan @
? Yah, B tidak menggunakan semua karakter. Tidak ada bpp
program (bandingkan cpp ) dan karakter lain tersedia dalam B (seperti #
yang kemudian digunakan oleh cpp).
Jika saya dapat menebak mengapa - ini karena di mana kuncinya. Dari manual di B :
Untuk memfasilitasi manipulasi alamat ketika tampaknya disarankan, B menyediakan dua operator alamat unary, *
dan &
. &
adalah operator alamat begitu &x
juga alamat x
, dengan anggapan ia memiliki satu. *
adalah operator tidak langsung; *x
berarti "menggunakan konten x sebagai alamat."
Perhatikan bahwa &
shift-7 dan *
shift-8. Kedekatan mereka satu sama lain mungkin merupakan petunjuk bagi programmer tentang apa yang mereka lakukan ... tapi itu hanya dugaan. Orang harus bertanya kepada Ken Thompson tentang mengapa pilihan itu dibuat.
Jadi, begitulah. C seperti itu karena B dulu. B seperti itu karena ingin berubah dari bagaimana BCPL itu.
->
sedang digunakan dalam bahasa C sebagai operator dereference - saat mengakses bidang dalam struct:,struct_pointer->field
yang merupakan kependekan dari(*struct_pointer).field
.