Yah, pada dasarnya saya mengerti cara menggunakan pointer, tetapi bukan cara terbaik untuk menggunakannya untuk melakukan pemrograman yang lebih baik.
Apa proyek atau masalah yang baik untuk diselesaikan yang melibatkan penggunaan pointer sehingga saya bisa memahaminya dengan lebih baik?
learning
c++
personal-projects
pointers
dysoco
sumber
sumber
Jawaban:
Memanipulasi sejumlah besar data dalam memori adalah tempat pointer benar-benar bersinar.
Melewati objek besar dengan referensi setara dengan hanya meneruskan angka lama yang polos. Anda dapat memanipulasi bagian-bagian yang diperlukan secara langsung sebagai lawan menyalin objek, mengubahnya, lalu mengirimkan kembali salinan untuk ditempatkan di tempat asli.
sumber
Konsep pointer memungkinkan Anda untuk merujuk ke data berdasarkan alamat tanpa menduplikasi penyimpanan data. Pendekatan ini memungkinkan penulisan algoritma yang efisien seperti:
Pengurutan
Saat memindahkan data dalam algoritma pengurutan, Anda dapat memindahkan penunjuk alih-alih data itu sendiri — pikirkan untuk mengurutkan jutaan baris pada string 100 karakter; Anda menyimpan banyak gerakan data yang tidak perlu.
Daftar tertaut
Anda dapat menyimpan lokasi item berikutnya dan / atau sebelumnya dan bukan seluruh data yang terkait dengan catatan.
Melewati parameter
Dalam hal ini, Anda meneruskan alamat data bukan data itu sendiri. Sekali lagi, pikirkan algoritma kompresi nama yang berjalan di jutaan baris.
Konsep ini dapat diperluas ke struktur data seperti database relasional di mana pointer mirip dengan kunci asing . Beberapa bahasa tidak menganjurkan penggunaan pointer seperti C # dan COBOL.
Contohnya dapat ditemukan di banyak tempat seperti:
Posting berikut mungkin relevan dalam beberapa cara:
sumber
Saya terkejut tidak ada jawaban lain yang menyebutkan ini: pointer memungkinkan Anda untuk membuat struktur data yang tidak bersebelahan dan non-linear, di mana suatu elemen mungkin terkait dengan beberapa lainnya dengan cara yang kompleks.
Daftar yang ditautkan (tunggal, ganda, dan ditautkan melingkar), pohon (merah-hitam, AVL, trie, biner, partisi ruang ...), dan grafik adalah semua contoh struktur yang dapat dibangun paling alami dalam hal referensi daripada hanya nilai .
sumber
Salah satu cara sederhana adalah dalam Polimorfisme. Polimorfisme hanya berfungsi dengan pointer.
Juga, Anda menggunakan pointer kapan saja Anda membutuhkan alokasi memori dinamis. Dalam C, ini biasanya terjadi ketika Anda perlu menyimpan data ke dalam array tetapi Anda tidak tahu ukurannya pada waktu kompilasi. Anda kemudian akan memanggil malloc untuk mengalokasikan memori dan pointer untuk mengaksesnya. Juga, apakah Anda mengetahuinya atau tidak, ketika Anda menggunakan array Anda menggunakan pointer.
adalah setara dengan
Pengetahuan ini memungkinkan Anda untuk melakukan hal-hal yang sangat keren seperti menyalin seluruh array dalam satu baris:
Di c ++, Anda menggunakan yang baru untuk mengalokasikan memori untuk objek dan menyimpannya ke dalam pointer. Anda melakukan ini kapan saja Anda perlu membuat objek selama run-time alih-alih selama waktu kompilasi (yaitu metode membuat objek baru dan menyimpannya ke dalam daftar).
Untuk memahami pointer lebih baik:
Temukan beberapa proyek yang menggunakan warisan.
Inilah proyek tempat saya memotong gigi:
Baca dalam dua matriks nxn dari file dan lakukan operasi ruang vektor dasar pada mereka dan cetak hasilnya ke layar.
Untuk melakukan ini, Anda harus menggunakan array dinamis dan merujuk array Anda dengan pointer karena Anda akan memiliki dua array array (array dinamis multi-dimensi). Setelah Anda menyelesaikan proyek itu, Anda akan memiliki ide yang cukup bagus bagaimana menggunakan pointer.
sumber
Untuk benar-benar memahami mengapa pointer penting, Anda perlu memahami perbedaan antara alokasi tumpukan dan alokasi tumpukan.
Berikut ini adalah contoh alokasi tumpukan:
Objek yang dialokasikan pada stack hanya ada selama durasi eksekusi fungsi saat ini. Ketika panggilan untuk
foo
keluar dari ruang lingkup begitu juga variabelf
.Satu kasus di mana ini menjadi masalah adalah ketika Anda perlu mengembalikan sesuatu selain tipe integral dari suatu fungsi (misalnya struktur Foo dari contoh di atas).
Misalnya, fungsi berikut akan menghasilkan apa yang disebut "perilaku tidak terdefinisi."
Jika Anda ingin mengembalikan sesuatu seperti
struct Foo *
dari fungsi yang benar-benar Anda butuhkan adalah alokasi tumpukan:Fungsi
malloc
mengalokasikan objek pada heap dan mengembalikan pointer ke objek itu. Perhatikan bahwa istilah "objek" digunakan secara longgar di sini, yang berarti "sesuatu" daripada objek dalam arti pemrograman berorientasi objek.Masa objek yang dialokasikan heap dikendalikan oleh programmer. Memori untuk objek ini akan dicadangkan sampai programmer membebaskannya, yaitu dengan menelepon
free()
atau sampai program keluar.Sunting : Saya gagal melihat pertanyaan ini ditandai sebagai pertanyaan C ++. Operator C ++
new
dannew[]
melakukan fungsi yang sama denganmalloc
. Operatordelete
dandelete[]
analog denganfree
. Sementaranew
dandelete
harus digunakan secara eksklusif untuk mengalokasikan dan membebaskan objek C ++, penggunaanmalloc
danfree
sepenuhnya legal dalam kode C ++.sumber
Tuliskan proyek non-sepele dalam C dan Anda AKAN harus memikirkan bagaimana / kapan menggunakan pointer. Dalam C ++ Anda sebagian besar akan menggunakan objek yang diaktifkan RAII yang mengelola pointer secara internal, tetapi dalam C raw pointer memiliki peran yang jauh lebih umum. Adapun jenis proyek apa yang harus Anda lakukan, bisa apa saja non-sepele:
Saya merekomendasikan yang terakhir.
sumber
Hampir semua masalah pemrograman yang dapat diselesaikan dengan pointer dapat diselesaikan dengan jenis referensi yang lebih aman lainnya (tidak mengacu pada referensi C ++ , tetapi konsep CS umum memiliki variabel merujuk pada nilai data yang disimpan di tempat lain).
Pointer dengan menjadi implementasi referensi tingkat rendah yang spesifik, di mana Anda dapat secara langsung memanipulasi alamat memori sangat kuat, tetapi bisa sedikit berbahaya untuk digunakan (misalnya, arahkan ke lokasi memori di luar program).
Manfaat menggunakan pointer secara langsung adalah mereka akan sedikit lebih cepat dengan tidak harus melakukan pemeriksaan keamanan. Bahasa seperti Java yang tidak secara langsung mengimplementasikan pointer C-style akan mengalami sedikit peningkatan kinerja, tetapi akan mengurangi banyak jenis situasi sulit untuk di-debug.
Adapun mengapa Anda perlu tipuan, daftar ini cukup panjang, tetapi pada dasarnya dua gagasan utama adalah:
selected_object
yang merupakan referensi ke salah satu objek jauh lebih efisien daripada menyalin nilai objek saat ini ke variabel baru.sumber
Manipulasi gambar tingkat piksel hampir selalu lebih mudah dan lebih cepat menggunakan pointer. Terkadang hanya dimungkinkan menggunakan pointer.
sumber
Pointer digunakan dalam begitu banyak bahasa pemrograman di bawah permukaan tanpa mengganggu pengguna tentang hal itu. C / C ++ hanya memberi Anda akses ke mereka.
Kapan menggunakannya: Sesering mungkin, karena menyalin data tidak efisien. Kapan tidak menggunakannya: Bila Anda ingin dua salinan yang dapat diubah secara individual. (Apa yang pada dasarnya akan menyalin konten object_1 ke tempat lain di memori dan mengembalikan pointer - kali ini menunjuk ke object_2)
sumber
Pointer adalah bagian penting untuk setiap implementasi struktur data dalam C dan struktur data adalah bagian penting dari setiap program non-sepele.
Jika Anda ingin mengetahui mengapa pointer itu sangat vital, maka saya sarankan untuk mempelajari apa itu daftar yang ditautkan dan mencoba untuk menulisnya tanpa menggunakan pointer. Saya belum membuat Anda tantangan yang mustahil, (PETUNJUK: pointer digunakan untuk referensi lokasi dalam memori, bagaimana Anda mereferensikan hal-hal dalam array?).
sumber
Sebagai contoh kehidupan nyata, membangun buku pesanan terbatas.
umpan ITCH 4.1, misalnya, memiliki konsep pesanan "ganti", di mana harga (dan karenanya, prioritas) dapat berubah. Anda ingin dapat mengambil pesanan dan memindahkannya ke tempat lain. Menerapkan antrian ujung ganda dengan pointer membuat operasi sangat mudah.
sumber
Membaca dengan teliti berbagai situs StackExchange, saya menyadari bahwa itu agak mode untuk mengajukan pertanyaan seperti ini. Dengan risiko kritik dan downvotes, saya akan jujur. Ini tidak dimaksudkan untuk menyulut atau menyulut api, saya hanya bermaksud membantu, dengan memberikan penilaian yang jujur atas pertanyaan itu.
Dan penilaian itu adalah sebagai berikut: Ini adalah pertanyaan yang sangat aneh untuk ditanyakan pada seorang programmer C. Hampir semua yang dikatakannya adalah "Saya tidak tahu C." Jika saya menganalisis sedikit lebih jauh dan lebih sinis, ada nada tindak lanjut dari "pertanyaan" ini: "Apakah ada beberapa jalan pintas yang dapat saya ambil untuk secara cepat dan tiba-tiba memperoleh pengetahuan seorang programmer C yang berpengalaman, tanpa mengabdikan waktu apa pun untuk belajar mandiri? " Setiap "jawaban" yang dapat diberikan seseorang bukanlah pengganti untuk pergi dan melakukan kerja keras untuk memahami konsep yang mendasarinya dan penggunaannya.
Saya merasa lebih konstruktif untuk belajar C dengan baik, langsung, daripada pergi di web dan bertanya kepada orang-orang ini. Ketika Anda tahu C dengan baik Anda tidak akan repot-repot mengajukan pertanyaan seperti ini, itu akan seperti bertanya "masalah apa yang paling baik diselesaikan dengan menggunakan sikat gigi?"
sumber
Meskipun pointer benar-benar bersinar saat bekerja dengan objek memori besar, masih ada cara untuk melakukan hal yang sama tanpa mereka.
Pointer sangat penting untuk apa yang disebut pemrograman dinamis , itu adalah ketika Anda tidak tahu berapa banyak memori yang Anda perlukan sebelum program Anda dijalankan. Dalam pemrograman dinamis, Anda dapat meminta potongan memori selama runtime dan menempatkan data Anda sendiri ke dalamnya - sehingga Anda perlu pointer atau referensi (perbedaannya tidak penting di sini) untuk dapat bekerja dengan potongan data tersebut.
Selama Anda dapat mengklaim memori tertentu selama runtime dan menempatkan data Anda ke dalam memori yang baru diperoleh, Anda dapat melakukan hal berikut:
Anda dapat memiliki struktur data yang diperluas sendiri. Itu adalah struktur yang dapat memperluas diri dengan mengklaim memori tambahan selama kapasitasnya habis. Properti utama dari setiap struktur self-extending adalah bahwa ia terdiri dari blok memori kecil (disebut node, item daftar dll tergantung pada struktur) dan setiap blok berisi referensi ke blok lain (s). Struktur "tertaut" ini membangun sebagian besar tipe data modern: grafik, pohon, daftar, dll.
Anda dapat memprogram menggunakan paradigma OOP (Object-Oriented Programming). Keseluruhan OOP didasarkan pada penggunaan variabel tidak langsung, tetapi referensi ke instance kelas (objek disebut) dan memanipulasi mereka. Tidak ada satu pun instance yang dapat ada tanpa pointer (meskipun dimungkinkan untuk menggunakan kelas statis saja bahkan tanpa pointer, itu agak pengecualian).
sumber
Lucu, saya baru saja menjawab pertanyaan tentang C ++ dan berbicara tentang petunjuk.
Versi singkatnya adalah Anda TIDAK PERNAH membutuhkan pointer kecuali 1) perpustakaan yang Anda gunakan memaksa Anda 2) Anda perlu referensi yang dapat dibatalkan.
Jika Anda membutuhkan sebuah array, daftar, string dll hanya memilikinya di stack dan gunakan objek stl. Mengembalikan atau melewati objek stl adalah cepat (fakta tidak dicentang) karena mereka memiliki kode internal yang menyalin pointer alih-alih objek dan hanya akan menyalin data jika Anda menulisnya. Ini adalah C ++ reguler bahkan C ++ 11 baru yang akan membuatnya lebih mudah pada penulis perpustakaan.
Pertanyaan Anda mungkin dijawab di bagian ini
Jika Anda menggunakan pointer pastikan itu dalam salah satu dari dua kondisi ini. 1) Anda memberikan masukan yang mungkin dapat dibatalkan. Contohnya adalah nama file opsional. 2) Jika Anda ingin memberikan kepemilikan. Seperti jika Anda melewatkan atau mengembalikan pointer, Anda tidak memiliki salinan apa pun yang tersisa atau menggunakan pointer yang Anda berikan
Tetapi saya belum pernah menggunakan pointer atau pointer pintar untuk waktu yang sangat lama dan saya telah membuat profil aplikasi saya. Ini berjalan sangat cepat.
CATATAN TAMBAHAN: Saya perhatikan bahwa saya menulis struct saya sendiri dan saya menyebarkannya. Jadi bagaimana saya melakukan ini tanpa menggunakan pointer? Ini bukan wadah STL jadi lewat ref lambat. Saya selalu memuat daftar data saya / deques / peta dan semacamnya. Saya tidak ingat mengembalikan benda apa pun kecuali itu semacam daftar / peta. Bahkan string. Saya melihat kode untuk objek tunggal dan saya perhatikan saya melakukan sesuatu seperti ini
{ MyStruct v; func(v, someinput); ... } void func(MyStruct&v, const D&someinput) { fillV; }
jadi saya cukup banyak mengembalikan objek (banyak) atau melakukan preallocate / pass dalam referensi untuk mengisi (tunggal).Sekarang jika Anda menulis deque Anda sendiri, peta, dll Anda harus menggunakan pointer. Tetapi Anda tidak perlu melakukannya. Biarkan STL dan mungkin meningkatkan kekhawatiran tentang itu. Anda hanya perlu menulis data dan solusinya. Bukan wadah untuk menampungnya;)
Saya harap Anda sekarang tidak pernah menggunakan pointer: D. Semoga berhasil berurusan dengan lib yang memaksa Anda melakukannya
sumber
Pointer sangat berguna untuk bekerja dengan perangkat yang dipetakan memori. Anda dapat menentukan struktur yang mencerminkan (katakanlah) register kontrol, kemudian menetapkannya ke alamat register kontrol aktual dalam memori dan memanipulasi secara langsung. Anda juga dapat mengarahkan langsung ke buffer transfer pada kartu atau chip jika MMU telah memetakannya ke dalam ruang memori sistem.
sumber
Saya melihat pointer sebagai jari telunjuk saya, kami gunakan untuk melakukan beberapa hal:
tolong maafkan jawaban yang buruk ini
sumber
Karena pertanyaan Anda ditandai C ++, saya akan menjawab pertanyaan Anda untuk bahasa itu.
Dalam C ++ ada perbedaan antara pointer dan referensi, oleh karena itu ada dua skenario di mana pointer (atau smart pointer) diperlukan untuk memfasilitasi perilaku tertentu. Mereka dapat digunakan dalam keadaan lain, namun Anda bertanya bagaimana "terbaik untuk menggunakannya", dan dalam semua keadaan lain ada alternatif yang lebih baik.
1. Polimorfisme
Pointer kelas dasar memungkinkan Anda untuk memanggil metode virtual yang tergantung pada jenis objek yang ditunjuk oleh pointer.
2. Membuat objek gigih
Pointer diperlukan saat membuat objek secara dinamis (di heap bukan stack). Ini diperlukan ketika Anda ingin agar objek seumur hidup lebih panjang dari ruang lingkup di mana ia dibuat.
Dalam hal "proyek bagus atau masalah untuk diselesaikan", seperti yang sudah dikatakan orang lain di sini, proyek non-sepele akan menggunakan pointer.
sumber