Apakah pikiran muda perlu mempelajari konsep penunjuk?

89

Mengapa master C Dennis Ritchie memperkenalkan pointer dalam C? Dan mengapa bahasa pemrograman lain seperti VB.NET atau Java atau C # menghilangkannya? Saya telah menemukan beberapa poin di Google, dan saya ingin mendengarkan komentar Anda juga. Mengapa mereka menghilangkan konsep pointer dalam bahasa modern?

Orang mengatakan C adalah bahasa dasar dan petunjuk adalah konsep yang membuat C kuat dan luar biasa dan membuat C masih bersaing dengan bahasa yang lebih modern. Lalu mengapa mereka menghilangkan pointer dalam bahasa yang lebih modern?

Apakah Anda pikir pengetahuan tentang pointer masih penting bagi programmer baru? Orang-orang menggunakan VB.NET atau Java hari ini, yang mendukung lebih banyak fitur-fitur yang lebih maju daripada C (dan tidak menggunakan konsep pointer) dan banyak orang seperti yang saya lihat sekarang (teman saya) memilih bahasa ini mengabaikan C karena mereka mendukung fitur-fitur canggih. Saya memberitahu mereka untuk memulai dengan C. Mereka mengatakan itu sia-sia untuk mempelajari konsep-konsep pointer ketika Anda melakukan hal-hal canggih di VB.NET atau Java yang tidak mungkin dalam C.

Bagaimana menurut anda?

Diperbarui :

Komentar yang saya baca di Google adalah:

  1. Komputer sebelumnya terlalu lambat dan tidak dioptimalkan.

  2. Menggunakan pointer memungkinkan untuk mengakses alamat secara langsung dan ini menghemat waktu alih-alih membuat salinannya dalam panggilan fungsi.

  3. Keamanan secara signifikan lebih buruk menggunakan pointer, dan itulah sebabnya Java dan C # tidak termasuk mereka.

Ini dan beberapa lagi apa yang saya temukan. Saya masih membutuhkan jawaban yang berharga. Itu akan sangat dihargai.

niko
sumber
52
Java tidak memiliki pointer? Itu tidak benar. Setiap referensi objek di Jawa pada dasarnya adalah sebuah pointer.
quant_dev
20
Apa yang dimaksud dengan quant_dev adalah bahwa Java penuh dengan pointer yang digunakan secara transparan, sementara programmer tidak dapat menggunakannya secara eksplisit.
sakisk
9
Inilah artikel dari Joel Spolsky yang relevan ... joelonsoftware.com/articles/fog0000000319.html
Joe Internet
11
"Mengapa master C Dennis Ritchie memperkenalkan pointer di c?" Pointer tidak diperkenalkan di c, mereka langsung datang di seberang dari praktik perakitan, termasuk nama.
dmckee
14
@quaint_dev: Yah, Java benar-benar tidak memiliki petunjuk. Referensi tidak dapat melakukan semua hal yang dapat dilakukan pointer, jadi berusaha memahami pointer dalam hal referensi bukanlah cara yang harus dilakukan (dan kesalahan yang dibuat oleh banyak programmer yang mempelajari C atau C ++). Pointer dapat melakukan aritmatika. Referensi tidak bisa. (Keterbatasan yang benar-benar menyengat setiap kali saya terpaksa menggunakan Java)
Billy ONeal

Jawaban:

128

Kembali pada masa itu, pengembang bekerja lebih dekat dengan logam. C pada dasarnya adalah pengganti tingkat yang lebih tinggi untuk perakitan, yang hampir sedekat dengan perangkat keras yang Anda bisa dapatkan, jadi wajar saja Anda membutuhkan petunjuk untuk menjadi efisien dalam menyelesaikan masalah pengkodean. Namun, pointer adalah alat yang tajam, yang dapat menyebabkan kerusakan besar jika digunakan secara sembarangan. Juga, penggunaan pointer secara langsung membuka kemungkinan banyak masalah keamanan, yang saat itu tidak menjadi masalah (pada tahun 1970, internet terdiri dari sekitar beberapa lusin mesin di beberapa universitas, dan bahkan tidak disebut seperti itu). ...), tetapi menjadi semakin penting sejak itu. Jadi saat ini bahasa tingkat yang lebih tinggi dirancang secara sadar untuk menghindari pointer memori mentah.

Mengatakan bahwa "hal-hal canggih yang dilakukan dalam VB.Net atau Java tidak mungkin dalam C" menunjukkan sudut pandang yang sangat terbatas, untuk sedikitnya :-)

Pertama-tama, semua bahasa ini (bahkan majelis) Turing lengkap sehingga dalam teori apa pun yang mungkin dalam satu bahasa, adalah mungkin dalam semua. Coba pikirkan apa yang terjadi ketika sepotong VB.Net atau kode Java dikompilasi dan dieksekusi: akhirnya, itu diterjemahkan ke dalam (atau dipetakan ke) kode mesin, karena itu adalah satu-satunya hal yang dimengerti mesin. Dalam bahasa yang dikompilasi seperti C dan C ++, Anda benar-benar bisa mendapatkan tubuh penuh kode mesin yang setara dengan kode sumber tingkat tinggi asli, sebagai satu atau lebih file / pustaka yang dapat dieksekusi. Dalam bahasa berbasis VM, lebih sulit (dan bahkan mungkin tidak mungkin) untuk mendapatkan seluruh representasi kode mesin yang setara dengan program Anda, tetapi pada akhirnya masih ada di suatu tempat, dalam ceruk yang dalam dari sistem runtime dan JIT.

Sekarang, tentu saja, ini adalah pertanyaan yang sepenuhnya berbeda apakah beberapa solusi layak dalam bahasa tertentu. Tidak ada pengembang yang masuk akal yang akan mulai menulis aplikasi web dalam perakitan :-) Tetapi perlu diingat bahwa sebagian besar atau semua bahasa tingkat tinggi itu dibangun di atas sejumlah besar runtime dan kode perpustakaan kelas, sebagian besar dari yang diimplementasikan dalam bahasa tingkat yang lebih rendah, biasanya dalam C.

Jadi untuk sampai ke pertanyaan,

Apakah menurut Anda pengetahuan tentang petunjuk kepada orang-orang muda [...] itu penting?

Konsep di balik pointer adalah tipuan . Ini adalah konsep yang sangat penting dan IMHO setiap programmer yang baik harus menangkapnya pada level tertentu. Bahkan jika seseorang bekerja hanya dengan bahasa tingkat yang lebih tinggi, tipuan dan referensi masih penting. Gagal memahami ini berarti tidak bisa menggunakan seluruh kelas alat yang sangat kuat, serius membatasi kemampuan pemecahan masalah seseorang dalam jangka panjang.

Jadi jawaban saya adalah ya, jika Anda ingin menjadi programmer yang benar-benar baik, Anda harus memahami pointer juga (serta rekursi - ini adalah batu sandungan khas lainnya untuk pengembang pemula). Anda mungkin tidak perlu memulainya - saya rasa C tidak optimal sebagai bahasa pertama saat ini. Tetapi pada titik tertentu seseorang harus terbiasa dengan tipuan. Tanpanya, kita tidak akan pernah bisa memahami bagaimana alat, pustaka, dan kerangka kerja yang kita gunakan benar-benar berfungsi. Dan pengrajin yang tidak mengerti bagaimana alatnya bekerja sangat terbatas. Cukup adil, seseorang dapat memahami itu dalam bahasa pemrograman tingkat yang lebih tinggi juga. Satu tes lakmus yang baik adalah menerapkan daftar yang ditautkan dengan benar - jika Anda dapat melakukannya dalam bahasa favorit Anda, Anda dapat mengklaim bahwa Anda memahami tipuan dengan cukup baik.

Tetapi jika bukan karena hal lain, kita harus melakukannya untuk belajar menghargai para programmer lama yang berhasil membangun hal-hal yang tidak dapat dipercaya dengan menggunakan alat-alat sederhana yang mereka miliki (dibandingkan dengan apa yang kita miliki sekarang). Kita semua berdiri di atas pundak para raksasa, dan sungguh baik bagi kita untuk mengakui hal ini, daripada berpura-pura bahwa kita adalah raksasa itu sendiri.

Péter Török
sumber
5
Ini adalah jawaban yang baik tetapi itu tidak benar-benar menjawab pertanyaan: "Apakah pikiran muda perlu mempelajari konsep pointer?"
Falcon
11
+1 Jawaban yang bagus. Saya akan membatalkan argumen kelengkapan turing - untuk pemrograman praktis, ini adalah herring merah, seperti yang juga Anda perhatikan nanti. Ini adalah teori komputabilitas, yaitu turing lengkap hanya berarti ada program di (untuk banyak bahasa, tak terbatas) program potensial yang mengimplementasikan algoritma yang sama, bukan apakah itu benar-benar layak atau bahkan mungkin secara manusiawi. Hanya dengan menunjukkan itu semua kode mesin pada akhirnya membuktikan hal itu juga tanpa menanam bodoh, "Saya bisa melakukan semuanya dalam satu bahasa karena semuanya sama, harhar!" benih.
5
+1 untuk "Dan pengrajin yang tidak mengerti bagaimana alatnya bekerja adalah alat yang sangat terbatas."
quick_now
6
Selain itu, tidak memahami mekanisme pointer (dan dengan referensi ekstensi) akibatnya berarti Anda tidak memahami konsep salinan struktur data yang dangkal / dalam, yang dapat menyebabkan bug serius yang sulit dilacak. Bahkan dalam bahasa tingkat tinggi "modern".
Mavrik
1
C dirancang untuk menjadi assembler portabel untuk Unix, yaitu dekat dengan logam.
39

Saya pikir Anda perlu berbeda.

Java dan bahasa tingkat tinggi lainnya tidak menghapus pointer. Apa yang mereka lakukan adalah menghapus aritmatika pointer biasa.

Bahkan, Java masih memungkinkan aritmatika pointer yang dilindungi dan dibatasi : akses array. Dalam C lama yang biasa, akses array tidak lain adalah dereferencing. Ini adalah notasi yang berbeda, gula sintaksis, jika Anda mau, untuk berkomunikasi dengan jelas, apa yang Anda lakukan.
Namun, array[index]setara dengan *(array+index). Karena itu juga setara dengan index[array]meskipun saya kira beberapa kompiler C mungkin memberi Anda peringatan, jika Anda melakukannya.
Sebagai akibat wajar, pointer[0]sama dengan *pointer. Itu hanya karena "penunjuk ke array" adalah alamat entri pertama array dan alamat elemen selanjutnya dihitung dengan menambahkan indeks.

Di Jawa, pointer aritmatika polos (referensi dan dereferencing) tidak ada lagi. Namun ada pointer. Mereka menyebutnya referensi, tetapi itu tidak mengubah apa itu. Dan akses array masih merupakan hal yang persis sama: Lihatlah alamatnya, tambahkan indeks dan gunakan lokasi memori itu. Namun di Jawa, itu akan memeriksa apakah indeks itu berada dalam batas array yang semula Anda alokasikan. Jika tidak, itu akan melempar pengecualian.

Sekarang keuntungan dari pendekatan Java adalah, bahwa Anda tidak memiliki kode, yang secara acak menulis byte acak ke lokasi memori arbitrer. Ini meningkatkan keamanan dan juga keamanan, karena jika Anda gagal memeriksa buffer overflow dan semacamnya, runtime akan melakukannya untuk Anda.

Kerugian dari ini adalah, itu hanya kurang kuat. Dimungkinkan untuk melakukan pemrograman yang aman memori dalam C. Tidak mungkin mendapatkan manfaat dari kecepatan dan kemungkinan pemrograman yang tidak aman di Jawa.

Sebenarnya, tidak ada yang sulit tentang pointer atau aritmatika pointer. Mereka biasanya dijelaskan dengan cara yang berbelit-belit, sedangkan semua penunjuk adalah, adalah indeks ke satu array raksasa (ruang memori Anda), semua yang dirujuk pada suatu nilai berarti memberi Anda indeks di mana menemukannya, semua yang dilakukan dereferencing adalah mencari. nilai pada indeks yang diberikan. (Ini hanya sedikit disederhanakan, karena tidak memperhitungkan bahwa nilai-nilai memiliki ukuran yang berbeda dalam memori, tergantung pada jenisnya. Tapi itu detail yang mendetail, bukan bagian dari konsep aktual)

IMHO, semua orang di pekerjaan kita harus bisa memahami itu, atau mereka hanya di bidang yang salah.

back2dos
sumber
13
+1 Java dan C # masih memiliki pointer, dan tentu saja NullPointerExceptions
jk.
5
Juga perhatikan bahwa referensi dapat menunjuk ke berbagai daerah dari waktu ke waktu, karena pengumpul sampah memindahkan barang-barang. Pointer biasanya statis.
3
+1: ini! Dan saya pikir ada dua hal yang sulit untuk dipahami tentang pointer (secara umum): tipuan (yang terjadi di C, C #, Java, ...) dan pointer aritmatika (yang tidak terjadi di Jawa dengan cara yang sama). Menurut saya keduanya adalah konsep penting untuk dipelajari dan keduanya merupakan batu sandungan utama bagi pemula. Tetapi mereka tidak perlu bingung: tipuan dapat terjadi tanpa aritmatika pointer.
Joachim Sauer
2
Sebenarnya, back2dositu benar pertama kalinya, karena (array + index)sudah memperhitungkan ukuran objek (dalam C).
Matthew Flaschen
4
@ CyberSkull, jawabannya adalah memberikan sintaksis yang setara array[index], dan itu *(array+index). Jika Anda ingin menunjukkan bagaimana kompiler melakukan hal-hal secara internal, Anda dapat secara eksplisit berbicara tentang byte atau memberikan perakitan.
Matthew Flaschen
24

Konsep pointer penting dalam tubuh pengetahuan pemrograman komputer umum. Memahami konsep itu baik untuk calon programmer atau programmer dari bahasa apa pun, bahkan jika bahasa tersebut tidak secara langsung mendukungnya.

Pointer digunakan dalam Struktur Data (daftar tertaut) dan desain Basis Data (Kunci Asing).

Bahasa seperti VB dan C # dapat mengirimkan data dengan "referensi" ke metode, yang dapat dianggap sebagai jenis pointer.

Memahami di mana data dialokasikan dalam memori (stack vs heap) masih penting untuk efisiensi algoritma.

Mempelajari dasar-dasar yang benar adalah penting menurut saya.

Tidak mungkin
sumber
Saya menemukan konsep umum sangat membantu, tetapi saya tidak pernah menemukan situasi di mana saya memerlukan pointer (diberikan saya menggunakan Java dan PHP kebanyakan). Satu-satunya contoh kursus C ++ saya yang pernah muncul untuk pointer adalah menggunakannya untuk membuat struktur data yang lebih kompleks seperti daftar dan kamus yang ada dalam bahasa pemrograman tingkat tinggi mana pun untuk memulai ..
Ben Brocka
2
Anda benar dalam satu hal, tetapi ketika Anda mengirimkan data ke metode, kemungkinannya adalah bahwa dalam beberapa kasus Anda melewatkan pointer ke variabel. Namun, konsep penunjuk berguna (menurut saya) terlepas dari penerapannya dalam bahasa perangkat lunak.
NoChance
1
@ SirTapTap: Itu karena jika Anda belajar C ++ dalam beberapa jenis saja, mereka mengajari Anda C ++. Bukan cara terbaik untuk menggunakan C ++. Pointer aritmatika biasanya ditutup-tutupi karena itu adalah sesuatu yang Anda dapat memiliki pengetahuan lewat C ++ dengan dan tidak tahu. Tetapi bahkan hal-hal seperti iterasi pada koleksi umum dilakukan dengan pointer di nyata / idiomatik C ++. (Karena ini adalah dasar dari cara kerja Standard Template Library)
Billy ONeal
@BillyONeal Pointer hampir setengahnya saja, sungguh, saya masih belum pernah menemukan penggunaan praktis untuk pointer (pintar) sebagai programmer, mengingat saya tidak pernah membutuhkan kontrol langsung atas memori dalam apa pun yang telah saya lakukan. Tentu saja selalu ada kemungkinan kursus itu diajarkan dengan buruk, itu bukan favorit saya.
Ben Brocka
1
@ SirTapTap: Penggunaan praktis: setiap koleksi dan algoritma di STL. std::sort, std::partition, std::find, Dll Mereka bekerja dengan pointer, dan mereka bekerja dengan benda-benda yang bertindak seperti pointer (iterator). Dan mereka mengerjakan semua koleksi umum; daftar tertaut, array dinamis, deques, pohon, atau jenis lain dari koleksi yang ditentukan pengguna. Anda tidak dapat melakukan abstraksi semacam itu tanpa petunjuk.
Billy ONeal
19

Ya, ya, ya, ya dan ya !!!

Jika Anda tidak tahu dasar-dasarnya, Anda TIDAK akan pernah bisa memecahkan masalah yang sangat sulit, aneh, sulit dan rumit yang menghadang Anda.

Dan jika Anda benar-benar memahami dasar-dasarnya, Anda JAUH lebih mudah dipasarkan di pasar kerja.


Saya pernah bekerja dengan seorang pria yang telah pemrograman selama 10 tahun, dan tidak tahu bagaimana pointer bekerja. Saya (jauh lebih junior) menghabiskan waktu berjam-jam di papan tulis untuk mendidiknya. Itu membuka mata saya. Dia tidak punya ide tentang begitu banyak hal mendasar.

Ketahui sebanyak mungkin yang Anda bisa.

cepat_now
sumber
Tapi apa dasar-dasarnya? Majelis, kode biner?
SiberianGuy
5
Sementara poin umum Anda "tahu sebanyak mungkin" adalah yang baik, saya akan mempertanyakan gagasan bahwa Anda akan "TIDAK PERNAH dapat memecahkan masalah yang benar-benar sulit, aneh, sulit dan rumit yang menghadang Anda" jika Anda tidak mengerti petunjuk. Ini entah bagaimana menyiratkan bahwa semua masalah sulit dapat diselesaikan dengan menggunakan pointer "ajaib" ini, yang tidak terjadi. Konsep-konsep antara pointer berguna untuk diketahui, tetapi mereka tidak langsung penting untuk banyak bidang pemrograman.
Dan Diplo
4
@Idsa: tidak, bahkan lebih mendasar, banyak programmer saat ini bahkan tidak tahu bagaimana transistor dan gerbang logika bekerja di chip 'ole' goo, dan mereka pasti seharusnya tahu bagaimana elektron bergerak dan efek ketidakpastian kuantum pada miniaturisasi; Saya bahkan belum mulai menggunakan dukun, lipton, dan bison! dan partikel bison Hiccups!
Lie Ryan
2
Dasar-dasar .... hal-hal seperti bagaimana barang disimpan. Perbedaan antara byte, kata, cara kerja masuk dan tidak ditandatangani. Cara kerja pointer. Apa itu karakter. Bagaimana hal-hal dikodekan dalam ASCII (dan hari ini, Unicode). Bagaimana daftar tertaut dapat dibuat dalam memori menggunakan struktur sederhana saja. Bagaimana string BENAR-BENAR bekerja. Dari hal-hal kecil ini, hal-hal yang lebih besar tumbuh.
cepat_now
5
Ketahuilah sebanyak mungkin prinsip yang baik, tetapi saya pikir Anda memiliki kereta di depan kuda. Pengembang yang baik berusaha untuk belajar apa pun yang mereka bisa karena mereka adalah pengembang yang baik. Kerinduan untuk pengetahuan adalah sifat dari pengembang yang baik. Itu bukan penyebab dari pengembang yang baik. Keluar dan belajar sebanyak mungkin tidak akan membuat Anda menjadi pengembang yang baik. Itu akan membuat Anda menjadi ensiklopedia berjalan, tidak lebih. Jika Anda adalah pengembang yang baik, MAKA Anda bisa MENERAPKAN pengetahuan yang Anda dapatkan untuk menyelesaikan masalah. Tetapi jika Anda belum menjadi pengembang yang baik, pengetahuan itu tidak akan banyak membantu Anda.
corsiKa
18

Ya, pemahaman itu penting.

Beberapa bulan yang lalu saya pemrograman di C #, dan saya ingin membuat salinan daftar. Tentu saja apa yang saya lakukan adalah NewList = OldList;dan kemudian mulai memodifikasi NewList. Ketika saya mencoba untuk mencetak kedua daftar, keduanya sama, karena NewListhanya sebuah penunjuk OldListdan bukan salinan, jadi saya benar-benar berubah OldListselama ini. Tidak butuh waktu lama bagi saya untuk mengetahui yang satu itu, tetapi beberapa teman sekelas saya tidak secepat itu dan harus dijelaskan mengapa ini terjadi.

Contoh:

List<int> a = new List<int>();
a.Add(2);
a.Add(9);
a.Add(8);
a.Add(1);
List<int> b = new List<int>();
b = a; //Does not make a copy, b is just a synonym!
b.Sort();
for (int i = 0; i < a.Count; i++)
{
    Console.WriteLine("a: " + a[i] + " b: " + b[i]);
}

Dan tentu saja, hasilnya seperti ini:

a: 1 b: 1
a: 2 b: 2
a: 8 b: 8
a: 9 b: 9

Mengetahui cara menggunakannya tidak begitu penting, namun memahaminya sangat penting!

Bojan Kogoj
sumber
2
Alih-alih, mengapa menggunakannya dan kapan menggunakannya adalah yang paling penting :)
niko
5
" NewListhanyalah sebuah pointer ke OldList" - tepatnya, keduanya NewListdan OldListhanya pointer, merujuk ke Listobjek yang sama .
Péter Török
Juga penting untuk dipahami bahwa daftar baru yang Anda buat btidak lagi tidak memiliki referensi untuk itu, dan sekarang menjadi sampah.
TMN
14

Menunjuk konsep! = Menunjuk aritmatika! = Menunjuk sintaks

Yang penting selalu, jika Anda perlu (dan Anda memang) memahami salinan yang dalam / dangkal, lulus dengan referensi / lulus dengan nilai, dll. Dua hal lainnya hanya penting jika bahasa Anda memungkinkan Anda menggunakannya.

Alien Life Form
sumber
1
Saat ini Anda perlu tahu hanya konsep dasar referensi, bukan penunjuk sintaks / matematika. Saya belajar pointer (dengan aritmatika & sintaks) di C kembali pada hari itu. Bahasa yang sekarang saya programkan tidak berurusan dengan pointer C-style yang memungkinkan Anda melakukan hal-hal yang tidak aman. Orang dapat memahami mengapa dalam python a=[1,2]; b=a; a.append(3)bahwa keduanya adan bakan merujuk kedua objek yang sama [1,2,3]tanpa mengetahui hal-hal seperti dalam C ielemen th array dapat dirujuk oleh arr[i]atau i[arr]sebagaimana keduanya *(arr+i). Saya lebih suka ketika bahasa tidak membiarkan i[arr]digunakan.
dr jimbob
" Dua masalah lainnya hanya jika bahasa Anda memungkinkan Anda untuk menggunakannya. " - Kalimat itu membawa penghancur diri sendiri. Bahasa du jour secara definisi sangat tidak mungkin menjadi bahasa yang sama yang digunakan besok. Dan besok Anda mungkin dihadapkan dengan bahasa yang mendukung penunjuk. Intinya? Lebih baik kita pegang sekarang, sekali dan selamanya. Itu tidak sulit, tetapi itu sepadan.
JensG
14

Mengapa master C Dennis Ritchie memperkenalkan pointer dalam C?

Karena pointer adalah mekanisme yang sangat kuat yang dapat digunakan dalam banyak cara.

Dan mengapa bahasa pemrograman lain seperti VB.NET atau Java atau C # menghilangkannya?

Karena pointer adalah mekanisme yang sangat berbahaya yang dapat disalahgunakan dalam banyak hal.

Saya pikir programmer harus belajar tentang pointer, tetapi dari perspektif pendidikan, tidak bijaksana untuk memperkenalkan mereka lebih awal. Alasannya adalah bahwa mereka digunakan untuk berbagai tujuan, sulit untuk mengatakan sebagai pemula mengapa Anda menggunakan pointer dalam keadaan tertentu.

Berikut adalah daftar tidak lengkap untuk apa pointer digunakan:

  • alokasi dinamis ( new T)
  • struktur data rekursif ( struct T { T* next; /* ... */ };)
  • iterators over arrays ( for (T* p = &a[0]; p != &a[0] + n; ++p) { ... })
  • akses bersama ke objek ( T* new_pointer = existing_pointer;)
  • polimorfisme subtipe ( T* pointer_to_base = pointer_to_derived;)
  • panggilan lama dengan referensi ( mutate(&object);)
  • jenis opsional ( if (p) { /* ... */ })

Perhatikan bahwa menggunakan mekanisme tunggal untuk semua konsep ini menunjukkan kekuatan dan keanggunan untuk programmer berpengalaman dan potensi kebingungan yang besar bagi seseorang yang baru dalam pemrograman.

FredOverflow
sumber
" Mengapa master C Dennis Ritchie memperkenalkan pointer dalam C ? Karena pointer adalah mekanisme yang sangat kuat yang dapat digunakan dalam banyak cara." - Saya tidak tahu pasti, tapi saya kira itu ada hubungannya dengan instruksi mesin untuk dibungkus ke dalam bahasa C, dan pendahulu dari programmer C. Assembler digunakan untuk berpikir dalam pointer, jadi itu akan menjadi sebuah kejutan jika dia tidak menggunakan mekanisme kuat yang terkenal ini. Hal lain akan terlalu jauh untuk 1978 atau bahkan 1960-an.
JensG
12

Mengapa? Anda dapat menulis sistem besar dengan desainer formulir dan pembuat kode. Bukankah itu cukup? (ironi)

Dan sekarang yang serius, pointer bukan bagian penting dari pemrograman di banyak bidang, tetapi mereka memungkinkan orang untuk memahami cara kerja internal. Dan jika kita tidak memiliki seorang pun yang memahami cara kerja internal, akan ada situasi di mana SQL2020, Windows 15 dan Linux 20,04 akan ditulis dalam mesin virtual sampah yang dikumpulkan dengan lebih dari 30 lapisan abstraksi, dengan kode yang dihasilkan melalui IDE, dalam JavaScript .

Ini jelas bukan yang ingin saya lihat.

Jadi ya, tentu saja mereka harus!

Coder
sumber
2
Humor bagus! +1 dan sepenuhnya setuju.
heltonbiker
7

Baik Jawa atau C # dihilangkan pointer, mereka memiliki referensi yang hampir sama. Apa yang dihilangkan adalah pointer arithmetics, yang dapat dihilangkan dalam kursus pengantar.
Tidak ada aplikasi non-sepele yang dapat dilakukan tanpa konsep pointer atau referensi, sehingga itu layak untuk diajarkan (Tidak ada alokasi memori dinamis yang dapat dilakukan tanpa mereka).

Pertimbangkan yang berikut ini dalam C ++ dan Java, dan saya kira itu tidak jauh berbeda dalam C #:
aClass *x = new aClass();
aClass x = new aClass();
Tidak ada terlalu banyak perbedaan antara pointer dan referensi, kan?
Pointer arithmetics harus dihindari kecuali jika diperlukan dan ketika pemrograman dengan model tingkat tinggi, jadi tidak ada banyak masalah di sana.

Petruza
sumber
6

Pemrogram profesional harus menguasai pointer.

Orang-orang yang ingin mengetahui pemrograman harus belajar tentang keberadaan dan implikasinya, tetapi tidak harus menggunakannya.

Orang-orang yang ingin menyelesaikan masalah pribadi melalui pemrograman (seperti saya, yang menggunakan banyak skrip Python) bisa mengabaikannya sama sekali.

Nah, itu menurut saya ...; o)

heltonbiker
sumber
3

Pointer address variabel adalah kasus spesifik dari konsep tipuan yang lebih umum. Indirection digunakan dalam sebagian besar (semua?) Bahasa modern dalam banyak konstruksi seperti delegasi dan panggilan balik. Memahami konsep tipuan memungkinkan Anda untuk mengetahui kapan dan bagaimana cara terbaik menggunakan alat-alat ini.

Dave Nay
sumber
3

Benar-benar YA ! Setiap orang yang program perlu memahami petunjuk dan tipuan.

Pointer adalah bagaimana sejumlah besar akses data dilakukan dalam semua bahasa. Pointer adalah fitur perangkat keras dari semua mikroprosesor. Bahasa tingkat tinggi seperti Java, VB & C # pada dasarnya menutup akses langsung ke petunjuk dari pengguna bahasa dengan referensi. Referensi merujuk ke objek melalui skema manajemen memori bahasa (bisa berupa pointer dengan metadata atau hanya nomor untuk tabel memori, misalnya).

Memahami bagaimana pointer bekerja sangat penting untuk memahami bagaimana sebenarnya komputer bekerja. Pointer juga lebih fleksibel dan kuat daripada referensi.

Sebagai contoh, alasan mengapa array mulai dari indeks nol adalah karena array sebenarnya adalah singkatan untuk aritmatika pointer. Tanpa belajar tentang cara kerja pointer, banyak programmer pemula tidak cukup mendapatkan array.

int a, foo[10];
foo[2] = a;

Baris 2 dalam aritmatika pointer adalah:

*(foo + sizeof(int) * 2) = a;

Tanpa memahami pointer, orang tidak dapat memahami manajemen memori, tumpukan, tumpukan atau bahkan array! Selain itu, orang perlu memahami pointer dan dereferencing untuk memahami bagaimana fungsi dan objek dilewatkan.

TL: DR : Memahami pointer adalah dasar untuk memahami agar komputer benar-benar berfungsi .

CyberSkull
sumber
2

Saya pikir itu bermuara pada kenyataan bahwa kebutuhan untuk berurusan dengan pointer jatuh ketika programmer kurang berurusan dengan perangkat keras langsung yang mereka jalankan. Misalnya, mengalokasikan struktur data daftar tertaut dengan cara yang sesuai dengan urutan modul memori 640 byte yang dimiliki perangkat keras khusus.

Berurusan dengan pointer secara manual dapat rawan kesalahan (mengarah ke kebocoran memori dan kode yang dapat dieksploitasi) dan memakan waktu untuk memperbaikinya. Jadi Java dan C # dll semua sekarang mengelola memori Anda dan pointer Anda untuk Anda melalui Mesin Virtual (VMs) mereka. Ini bisa dibilang kurang efisien daripada menggunakan C / C ++ mentah, meskipun VM terus meningkat.

C (dan C ++) masih banyak digunakan bahasa, terutama di High Performance Computing, Gaming, dan ruang perangkat keras tertanam. Saya pribadi bersyukur saya belajar tentang pointer karena transisi ke referensi Java (konsep yang mirip dengan pointer) sangat mudah dan saya tidak kehilangan ketika saya melihat NullPointerException pertama saya (yang seharusnya benar-benar disebut NullReferenceException, tapi saya ngelantur) .

Saya akan menyarankan belajar tentang konsep pointer karena mereka masih menopang banyak struktur data dll. Kemudian pergi untuk memilih bahasa yang Anda suka bekerja, mengetahui bahwa jika sesuatu seperti NPE muncul, Anda tahu apa yang sebenarnya terjadi .

Martijn Verburg
sumber
0

Ini adalah kebenaran objektif:

Beberapa bahasa mendukung akses memori langsung (pointer), beberapa tidak. Ada alasan bagus untuk setiap kasus.

  1. Seperti yang dikatakan seseorang di sini, di masa C, manajemen memori otomatis tidak serumit seperti sekarang ini. Dan bagaimanapun, orang sudah terbiasa dengannya. Pemrogram yang baik saat itu memiliki pemahaman yang jauh lebih dalam tentang program komputer daripada generasi kita (saya 21). Mereka telah menggunakan kartu punch dan hari menunggu untuk beberapa waktu kompilasi pada mainframe. Mereka mungkin tahu mengapa setiap bit dalam kode mereka ada.

  2. Keuntungan nyata dari bahasa seperti C adalah bahwa mereka memungkinkan Anda untuk memiliki kontrol yang lebih baik atas program Anda. Kapan Anda benar - benar membutuhkannya , hari ini? Hanya ketika Anda membuat aplikasi infrastruktur, seperti program terkait OS dan lingkungan runtime. Jika Anda hanya ingin mengembangkan perangkat lunak yang baik, cepat, kuat, dan andal, maka manajemen memori otomatis paling sering menjadi pilihan Anda yang lebih baik.

  3. Faktanya adalah bahwa akses memori langsung sebagian besar telah disalahgunakan selama sejarah pengembangan perangkat lunak. Orang-orang telah membuat program yang membocorkan memori, dan sebenarnya lebih lambat karena alokasi memori yang berlebihan (dalam C itu mudah dan umum untuk memperpanjang ruang memori virtual proses untuk setiap alokasi tunggal).

  4. Saat ini, mesin virtual / runtime melakukan pekerjaan yang jauh lebih baik daripada 99% programmer dalam mengalokasikan dan melepaskan memori. Selain itu, mereka memungkinkan Anda fleksibilitas ekstra dalam aliran yang Anda inginkan untuk program Anda, karena Anda (kebanyakan) tidak sibuk dengan membebaskan memori yang dialokasikan pada waktu dan tempat yang tepat.

  5. Adapun pengetahuan. Saya pikir itu mengagumkan bahwa programmer tahu bagaimana lingkungan tempat mereka memprogram diimplementasikan. Belum tentu dengan detail terkecil, tapi gambaran besarnya.

Saya pikir mengetahui bagaimana pointer bekerja (paling tidak) menarik. Sama seperti mengetahui bagaimana polimorfisme diimplementasikan. Dari mana proses Anda mendapatkan ingatannya, dan bagaimana. Ini adalah hal-hal yang selalu menarik bagi saya, secara pribadi. Jujur saya dapat mengatakan bahwa mereka telah membuat saya seorang programmer yang lebih baik, tetapi saya tidak dapat mengatakan bahwa mereka adalah kebutuhan pendidikan bagi siapa saja yang ingin menjadi programmer yang baik. Dalam kedua kasus itu, mengetahui lebih banyak sering kali akan membuat Anda lebih baik dalam pekerjaan Anda.

  1. Cara saya melihatnya, jika semua yang Anda diminta lakukan adalah membuat aplikasi di Java atau C # atau sesuatu seperti itu, maka Anda perlu fokus pada desain yang tepat dan teknik implementasi. Kode yang dapat diuji, kode bersih, kode fleksibel. Dalam urutan itu.

Karena bahkan jika Anda tidak mengetahui semua detail kecil, seseorang yang melakukannya akan dapat mengubah apa yang Anda buat menjadi sesuatu yang hanya berkinerja lebih baik. Dan itu seringkali bukan pekerjaan yang sulit, setelah Anda memiliki desain yang tepat, bersih dan dapat diuji di tempat (dan itu biasanya sebagian besar pekerjaan).

Jika saya seorang pewawancara yang ingin mempekerjakan seseorang untuk aplikasi bahasa tingkat tinggi, itu akan menjadi hal yang paling menarik bagi saya.

Pengetahuan tingkat rendah adalah bonus. Ini bagus untuk debugging dan sesekali menciptakan solusi yang sedikit lebih baik. Itu membuat Anda orang yang menarik, secara profesional. Ini memberi Anda rasa hormat di tempat kerja Anda.

Tetapi di dunia sekarang ini, itu bukanlah persyaratan suci.

Yam Marcovic
sumber
-1

Untuk sebagian besar tujuan praktis dalam bahasa OO tingkat tinggi, cukup memahami referensi, Anda tidak benar-benar perlu memahami bagaimana cara bahasa ini menerapkan referensi dalam hal petunjuk.

Ada banyak lebih banyak pendekatan multi-paradigma fungsional dan modern yang saya nilai jauh lebih tinggi daripada mampu melakukan aritmatika pointer mewah untuk mengatakan, menulis fungsi copy string dioptimalkan 1000 mungkin melakukan lebih buruk daripada String.copy std lib Anda dengan cara apa pun.

Saya menyarankan untuk mempelajari konsep yang jauh lebih berbeda, tingkat lebih tinggi terlebih dahulu, dan bercabang untuk belajar bahasa dari desain yang berbeda untuk memperluas wawasan Anda sebelum mencoba untuk mengkhususkan diri dalam hal-hal yang dekat dengan perangkat keras.

Saya sering melihat upaya yang gagal total untuk mengoptimalkan web servlet atau kode serupa untuk keuntungan 5%, ketika caching (memoisasi), pengoptimalan SQL, atau hanya penyetelan konfigurasi server web dapat menghasilkan 100% atau lebih dengan sedikit usaha. Mengotak-atik pointer adalah optimasi prematur dalam banyak kasus.

Jürgen Strobel
sumber
-1

Tentunya, kita perlu memiliki konsep pointer yang menyeluruh, jika Anda benar-benar ingin menjadi programmer yang baik. Alasan untuk konsep Pointer adalah akses langsung ke nilai Anda yang menjadi lebih efisien dan efektif dengan batasan waktu ...

Juga, Sekarang, mengingat Aplikasi Seluler, yang memiliki Memori sangat terbatas, kita perlu menggunakannya dengan sangat hati-hati sehingga operasinya sangat cepat dengan respons pengguna ... Jadi untuk tujuan ini kita memerlukan referensi langsung ke nilai ...

Pertimbangkan perangkat Apple, atau bahasa Objective C, yang sepenuhnya berfungsi dengan konsep pointer saja. Semua variabel yang dinyatakan dalam Objective C memiliki Pointer. Anda harus membaca wiki Objective C

Dshah
sumber
Aplikasi seluler Todays memiliki lebih banyak memori yang tersedia daripada beberapa pusat data yang dikandung C. Banyak aplikasi seluler ditulis dalam Java, atau langsung html + javascript, semua tanpa petunjuk (yang memiliki REFERENSI). Hanya sebagian kecil programmer yang sangat terspesialisasi yang dapat melihat lapisan OS yang mendasarinya.
Jürgen Strobel