it-swarm-id.com

Apa penjelasan yang bagus untuk petunjuk?

Dalam studi Anda sendiri (sendiri, atau untuk kelas) apakah Anda memiliki momen "ah ha" ketika akhirnya, Anda benar-benar memahami petunjuk? Apakah Anda memiliki penjelasan yang Anda gunakan untuk programmer pemula yang tampaknya sangat efektif?

Misalnya, ketika pemula pertama kali menemukan pointer di C, mereka mungkin menambahkan &s dan *s sampai dikompilasi (seperti yang pernah saya lakukan). Mungkin itu adalah gambar, atau contoh yang sangat termotivasi, yang membuat petunjuk "klik" untuk Anda atau siswa Anda. Apa itu, dan apa yang Anda coba sebelumnya yang tampaknya tidak berhasil? Apakah ada topik prasyarat (mis. Struct, atau array)?

Dengan kata lain, apa yang diperlukan untuk memahami arti &s dan *, kapan Anda bisa menggunakannya dengan percaya diri? Mempelajari sintaks dan terminologi atau kasus penggunaan tidak cukup, pada titik tertentu ide perlu diinternalisasi.


Pembaruan: Saya sangat suka jawabannya sejauh ini; tolong teruskan mereka. Ada banyak perspektif hebat di sini, tapi saya pikir banyak penjelasan/slogan yang bagus untuk diri kita sendiri setelah kita sudah menginternalisasikan konsepnya. Saya mencari konteks dan keadaan terperinci saat Anda sadar.

Sebagai contoh:

Saya hanya sedikit mengerti pointer secara sintaksis dalam C. Saya mendengar dua teman saya menjelaskan pointer ke teman lain, yang bertanya mengapa struct dilewatkan dengan sebuah pointer. Teman pertama berbicara tentang bagaimana itu perlu direferensikan dan dimodifikasi, tetapi itu hanya komentar singkat dari teman lain di mana itu mengenai saya: "Ini juga lebih efisien." Melewati 4 byte, bukan 16 byte, adalah pergeseran konseptual terakhir yang saya butuhkan.

72
Macneil

Diagram Memory-as-a-Grid

Biasanya yang saya lakukan adalah merepresentasikan memori sebagai "kisi", sehingga saya dapat membuat alamat, menyorot ruang memori yang berbeda dan menulis dalam nilai sel (atau bahkan lebih jauh, representasi binernya) dan menghubungkan pointer dalam memori dengan nilai yang mereka miliki. menunjuk pada. (Dan kemudian masih menyebutkan bahwa itu penyederhanaan).

Biasanya ini adalah momen "ohhhh" bagi sebagian besar siswa saya.

Simbol Juggling

Kemudian ketika mereka berhenti membuat mereka lupa bagaimana menggunakan & dan *, itu sangat sederhana: sajikan dengan cara yang sama seperti ketika mereka melakukan perhitungan matematika atau fisika. Jika Anda membagi jarak dalam km dengan waktu dalam jam, Anda mendapatkan kecepatan dalam km/jam. Apa yang perlu keluar. Sederhana.

printf ke Penyelamatan

Melakukan beberapa contoh dasar yang secara visual mewakili apa yang Anda jelaskan dengan ini akan menghibur mereka dalam apa yang mereka pikir mereka pahami, atau memberi mereka kesempatan untuk mengatakan "ah, saya tidak mengerti yang ini".

Menjadi Luas

Tutup petunjuk untuk tipe sederhana dan pastikan mereka memahami perbedaan antara pengalamatan dan ukuran tipe data, lalu susun, lalu susun, dan berbagai level.

Kemudian mulai aritmatika pointer.


Tambahan: Rekursi

Saya biasanya menjelaskan rekursi dengan cara yang sama, menggunakan representasi visual. Mintalah mereka mencetak alfabet menggunakan fungsi pra-dibuat yang menulis satu karakter, dan kemudian minta mereka untuk mencetaknya dalam urutan terbalik dengan hanya mengubah dua baris.

Biasanya ada "apa ...?" saat, dan ketika Anda menambahkan hanya parameter lain ke printf Anda untuk mencetak nilai numerik dan indentasi langkah-langkahnya, itu menjadi desahan lega.


Alternatif: Model Play-Doh dan Piala Air

Saya sebenarnya memiliki beberapa rekan kerja di sebuah universitas yang menunjukkan kepada siswa sebuah video yang menjelaskan petunjuk dan akses memori menggunakan pasta play-doh. Itu sangat pintar dan dilakukan dengan baik, meskipun saya sendiri tidak pernah benar-benar menggunakan teknik itu, kecuali untuk pelajar yang sangat muda yang tertarik dalam memahami pemrograman (tetapi biasanya mereka yang saya tidak akan mengarahkan mereka ke bahasa yang menggunakan pointer terlalu dini). Pada dasarnya menggunakan bola-bola play-doh kecil yang dapat Anda pasang ke bola-bola play-doh lain yang lebih besar yang mewakili ruang memori, dan bahwa Anda dapat menggabungkan bersama-sama untuk menautkan keduanya (seperti dalam struktur data yang ditautkan) atau bergabung bersama (seperti dalam berdekatan) ruang memori). Menggunakan warna berbeda untuk ruang memori yang ditunjuk dan pointer membantu juga. Tapi saya masih berpikir bahwa Memory-as-a-Grid berfungsi lebih baik, karena Anda dapat dengan jelas menunjukkan bahwa menunjuk sebenarnya adalah masalah "mengatasi", seperti pada "peta/kotak". Sedangkan mode Play-doh masih membingungkan mereka untuk berpikir bahwa segala sesuatu benar-benar "saling menyentuh" ​​dalam memori.

Hal Piala Air digunakan langsung oleh seorang rekan juga, tapi saya tidak tahu apakah dia datang dengan itu. Itu adalah pendekatan yang menarik, tetapi saya perhatikan banyak siswa yang bingung dengan penjelasannya. Sesuatu yang mirip dengan teknik Piala Kopi DevSolo . Tapi saya pikir itu sebenarnya yang menyesatkan ketika Anda membuat siswa bingung wadah, struktur data, petunjuk dan array. Mungkin ini pendekatan yang menarik untuk menjelaskan array pada awalnya saya anggap, tapi saya tidak akan bertahan terlalu lama.

25
haylem

Seseorang yang jauh lebih bijaksana daripada yang pernah saya katakan:

Biarawati Wu Jincang bertanya kepada Patriach Keenam Huineng, "Saya telah mempelajari sutra Mahaparinirvana selama bertahun-tahun, namun ada banyak area yang saya tidak begitu mengerti. Tolong beri tahu saya."

Patriach itu menjawab, "Saya buta huruf. Tolong bacakan karakter untuk saya dan mungkin saya akan bisa menjelaskan artinya."

Kata biarawati itu, "Kamu bahkan tidak bisa mengenali karakternya. Bagaimana kamu bisa mengerti artinya?"

"Kebenaran tidak ada hubungannya dengan kata-kata. Kebenaran dapat disamakan dengan bulan yang cerah di langit. Kata-kata, dalam hal ini, dapat disamakan dengan jari. Jari dapat menunjuk ke lokasi bulan. Namun, jari bukanlah bulan. Untuk melihat bulan, perlu untuk menatap ke luar jari, kan? "

80
Frank Shearar

Saya menemukan bahwa diagram sangat membantu. Contoh:

pointer diagram


Diagram seperti ini membantu saya melihat bahwa pointer adalah variabel mereka sendiri, tetapi berisi nilai yang merupakan lokasi objek lain, yaitu array atau string. Juga, ketika dilakukan dengan pensil, saya bisa menggunakannya untuk melacak program saya di atas kertas, atau di papan tulis/papan tulis.

46
Michael K

Ketika saya pertama kali "belajar" tentang pointer, saya agak tertarik padanya. Universitas saya telah membuat keputusan sejak lama sebelum saya mendaftar untuk memusatkan kurikulum di sekitar Jawa, jadi ketika profesor Struktur Data saya memberikan satu kuliah tentang C dan meminta kami untuk menerapkan Daftar-XOR dengan petunjuk, saya merasa seperti sedang melakukan sesuatu arah di atas kepalaku.

Saya mengerti definisi:

Pointer adalah variabel yang berisi alamat variabel

Tetapi saya masih belum mengerti sebagian besar konsep itu. Melihat ke belakang, saya pikir itu berpusat pada tiga hal:

  1. Apa sebenarnya itu lokasi memori? (Pada saat itu saya tidak mengambil kelas Organisasi Komputer)

  2. Sintaks canggung (Jadi um ... mengapa tepatnya itu didefinisikan seperti "int * ip" tapi kemudian saya merujuk variabel sebagai "ip"?)

  3. Bagaimana sebenarnya bermanfaat untuk menyimpan alamat variabel daripada hanya menggunakan variabel?

Baru setelah saya membeli buku K&R dan menyelesaikan setiap masalah, saya benar-benar memahami petunjuk. Selain fakta bahwa saya telah lama menyelesaikan kelas Organisasi Komputer (yang saya pikir harus diminta sebelum belajar C), bagian itu ada hubungannya dengan fakta bahwa saya menyadari bahwa pointer dapat digunakan untuk fungsi, array, struct ... untuk melakukan hal-hal yang bermanfaat dan tidak hanya sebagai penyimpanan untuk alamat variabel biasa.

Tapi momen "aha" saya sejauh ini adalah cara K&R menjelaskan sintaks canggung dalam mendefinisikan pointer sederhana. Saya membuat catatan di seluruh buku (di mana saya mengulangi poin-poin yang dibuat oleh buku menjadi kata-kata saya sendiri untuk memajukan pemahaman saya), dan ini adalah yang berkaitan dengan itu:

Pointer adalah variabel yang berisi alamat ke suatu variabel. Suatu pointer didefinisikan dan didereferensiasi (menghasilkan nilai yang disimpan pada lokasi memori yang ditunjuknya) dengan operator '*'; ekspresinya mnemonik.

Ex.: 
   int a;      /* Variable 'a' is an integer */

   int *ip;   /* Variable ip is a pointer and dereferencing it gives an integer.
                 In other words, the expression *ip is an int, so ip is a pointer
                 to an int */

Saya selalu merasa bahwa saya tidak dapat sepenuhnya memahami konsep pointer yang lebih maju sampai saya memiliki sesuatu yang begitu mendasar yang tertanam di kepala saya. Itu mengganggu saya tanpa henti setelah penugasan itu (yang saya tidak lakukan dengan baik, omong-omong;)) mengapa "* ip" tidak ada setelah saya (pikir saya) mendefinisikan "* ip". Menguasai ini penting untuk konsep yang lebih maju yang melibatkan pointer, seperti pointer fungsi dan definisi yang lebih rumit seperti ini:

char (*(x())[])()

Secara keseluruhan, saya pikir konsep pointer membutuhkan:

  1. Pemahaman dasar tentang bagaimana memori diletakkan di komputer (dan apa memori itu).

  2. Pengetahuan tentang seberapa kuat pointer dapat digunakan (penggunaan dunia nyata, bukan hanya konsep abstrak lain yang mereka pelajari demi pembelajaran).

  3. Menguraikan hieroglif yang secara sehari-hari dikenal sebagai "definisi pointer"

Jadi semuanya, saya pikir harus ada setidaknya 3 "aha" saat belajar tentang pointer. Saya masih mahasiswa jadi saya pikir Anda akan menghargai sudut pandang seseorang yang masih (relatif) baru belajar konsep.

32
Kevin

Pointer agak mirip dengan pintasan aplikasi di desktop Anda. Hapus pintasan dan target masih ada. Mulai pintasan dan target mulai.

Saya selalu menjelaskan cara kerjanya dengan cara sederhana membuat file txt di desktop saya dan dua pintasan ke file tersebut. Setelah menyalin dan menghapus pintasan, Anda dapat melihat orang memahami ide di balik 'referensi'.

Setelah grup memahami dasar di balik cara pintas Anda dapat mulai menjelaskan petunjuk yang Anda inginkan. Mereka mungkin akan memahaminya dengan mudah.

19
Barfieldmv

8-10 tahun yang lalu, saya mengajar kursus intro "C" di community college. Ini selalu menjadi topik yang menyenangkan untuk dijelajahi. Apa yang tampaknya paling berhasil, dan ini setelah membahas beberapa rekan kerja beberapa kali adalah dengan menggunakan cangkir kopi dan tangan Anda.

Saya menggunakan analogi cangkir kopi (atau deretannya untuk array) sebagai variabel (dapat menampung sesuatu). Saya kemudian menggunakan tangan saya, yang juga bisa memegang sesuatu atau, dengan mengulurkan jari telunjuk saya untuk "menunjuk ke" cangkir kopi.

Tangan yang dekat adalah nol, jari menunjuk kepalaku (seperti senjata tiruan) adalah penunjuk yang menggantung.

Kemudian dengan beberapa demonstrasi dan perjalanan melalui debugger, itu diklik dengan sebagian besar.

14
DevSolo

Saya benar-benar merasa khawatir ketika mendengar pertanyaan "bagaimana Anda memahami petunjuk". Saya selalu berpikir konsepnya sangat sederhana, dan evolusi logis dari bahasa memberikan kekuatan besar bagi para programmer.

Hal yang membuat saya khawatir adalah saya tidak pernah merasa sulit untuk memahami konsep pointer. Jadi ketika Anda di sini "kapan Anda akhirnya mendapatkannya" berulang-ulang, Anda mulai berpikir:

Apakah saya benar-benar mendapatkannya? Mungkin saya tidak pernah melakukannya?

Mungkin alasan mengapa konsep itu tampaknya rumit, adalah karena kami terus memberi tahu semua orang yang belum menemukan mereka bahwa petunjuk itu sangat sulit, dan di sini ada ratusan cara yang dapat Anda pelajari?

Hanya melempar ide itu ke luar sana, tentu saja secara pribadi saya suka diagram yang bagus dan Steve Gibson selalu melakukan pekerjaan yang fantastis untuk menjelaskan apa pun !

10
Marcus Whybrow

Saya tidak pernah memiliki banyak masalah dengan pointer di C, tetapi itu mungkin karena saya harus belajar assembler terlebih dahulu. Sebenarnya itu melegakan karena tidak perlu lagi mengelola alamat. Jadi mungkin jawabannya (dengan asumsi ini adalah sesuatu yang Anda ajarkan) adalah untuk memberi siswa bahasa Majelis yang ditiru untuk digunakan. Mereka akan mencari tahu dalam proses penulisan apa pun yang lebih canggih dari "Halo, dunia."

7
Larry Coleman

Pointer adalah variabel yang nilainya adalah alamat memori variabel lain.

7
kirk.burleson

Bagaimana saya benar-benar belajar tentang petunjuk? Dengan menulis tahun baru kompiler mahasiswa baru kuliah.

Bagaimana cara menjelaskan pointer dalam istilah awam? Saya suka analogi (tanggal?) Dari katalog perpustakaan yang disimpan pada kartu indeks. Setiap kartu ("pointer") berisi informasi tentang di mana beberapa buku ("data") berada, tetapi sebenarnya tidak mengandung buku itu sendiri. Jika Anda memodifikasi kartu ("aritmatika penunjuk"), yang dilakukannya hanyalah mengubah buku yang ditunjuknya dan tidak memiliki dampak pada buku itu sendiri - hanya berhati-hati untuk tidak mengacaukan alamatnya atau Anda mungkin menunjuk ke buku yang tidak ada. atau bahkan perpustakaan yang salah. Namun, jika Anda mengikuti "alamat" pada kartu dan pergi ke bagian perpustakaan yang tepat ("dereference the pointer"), Anda dapat melihat/memodifikasi buku itu sendiri.

6

Diedit untuk mendukung persyaratan pertanyaan yang direvisi

Path saya untuk memahami "post-pointer" (jika saya ingat dengan benar) berjalan seperti ini. Saya memiliki beberapa pengalaman sederhana pemrograman Majelis sejak saya masih bergurau dengan BBC Micro jadi saya memiliki konsep memori sebagai banyak kotak (lihat di bawah untuk ini). Ini diperkuat oleh penggunaan array. Namun, saya pergi ke dunia C dan harus berurusan dengan string dan itu berarti petunjuk. Dalam BASIC ini sepele, di assembler saya tidak pernah harus bekerja dengan mereka, dan sekarang di C klasik itu semua petunjuk dan hal-hal. Ah, tapi saya bisa kembali ke array dengan (null terminated) string seperti ini:

char s[] = "Hello, world!";
printf("%s",s);

Semua baik dan bagus, itu hanya array karakter (8 bit per karakter di dunia kecilku) dengan karakter nol di akhir untuk menunjukkan di mana ia berakhir. Printf hanya mengambil array itu dan menjalankannya mencetaknya. Tetapi bagaimana jika saya ingin meneruskan string ini ke suatu fungsi?

void print_str(char* p) {
  printf("%s",p);
}

Apakah yang dikatakan manual, tetapi tentang apa itu *? Hmm, char * berarti "pointer ke char". OKE ... kehilangan saya. Kemudian saya sadar bahwa char * membuat p sama dengan s [0]. OK, saya bisa menggunakannya, tapi saya masih belum tahu apa artinya. Maksud saya, bagaimana cara mengatur beberapa data dengan salah satu dari hal-hal ini? Pergi ke manual lagi ...

char* p = "Hello World!";

Saat saya menulis di atas, saya berkata pada diri saya "mendeklarasikan pointer ke char dan mengaturnya sama dengan array karakter ini". Entah bagaimana pointer itu menghilangkan kebutuhan akan sebuah array. Kira kompiler melakukan beberapa hal untuk saya untuk perubahan. Jadi bagaimana saya bisa mengubah array dengan pointer ini? Saya tahu bahwa saya bisa menggunakan versi array

 s[2] = 'L'; 

tapi apa yang setara dalam "pointer speak"? Pergi ke manual itu lagi ...

*(p+2) = 'L';

Saya kira * itu berarti "isi alamat memori" dan (p+2) adalah s[2]. Yang berarti bahwa pointer p adalah ... hanya ... alamat ... bong!

Bahwa ada suara Pencerahan. Saya tiba-tiba memutar pointer (itu sudah lama, kami timer lama tidak "grok" sampai nanti). Itu hanya tipuan.


Asli:

OK, nilai 2c saya:

Bayangkan memori adalah banyak kotak. Setiap kotak memiliki nomor di samping (alamat). Setiap kotak berisi angka (konten). Anda dapat bekerja dengan kotak-kotak ini dalam 2 cara: variabel (Saya ingin isi kotak N), pointer (Saya ingin isi kotak apa pun yang ada di kotak N ). Pointer hanyalah tipuan.

Dan untuk jawaban besar yang mencakup semua yang perlu Anda ketahui - baca ini .

5
Gary Rowe

Saya akan berasumsi seseorang akan belajar pointer mengetahui apa variabel normal dan bagaimana mereka bekerja dalam C. Sekarang, mari kita coba mendefinisikan pointer dengan beberapa atribut itu-

  • Mereka juga variabel, tetapi sifatnya berbeda. Asumsikan ada dua lapisan dalam ruang variabel. Variabel normal dari berbagai jenis berada di lapisan atas dan pointer di lapisan bawah. Seperti gambar ini-

    alt text

  • Seperti yang ditunjukkan oleh nama 'Pointer', pointer dapat POINT ke sesuatu. Seperti jari kita bisa menunjuk ke suatu objek. Hal-hal apa yang mereka tunjukkan? Ini adalah variabel normal. Singkatnya, "Pointer menunjuk ke variabel normal".

  • Seperti variabel normal, pointer juga memiliki jumlah tipe yang sama seperti int, char atau float. Dan pointer dari tipe tertentu hanya bisa menunjuk ke tipe variabel yang sama.
  • Suatu pointer dapat menunjuk ke satu variabel dan kemudian pointer yang sama dapat menunjuk ke variabel lain. Hanya jenisnya harus sama. Jadi, hubungan pointer dengan beberapa variabel tidak permanen dan dapat diubah.
  • Jadi, bagaimana sebuah pointer dinyatakan? Hampir seperti variabel normal. Anda harus mengawali nama dengan tanda bintang (*). Suka-

    int *pointer;
    
  • Lalu, bagaimana sebuah pointer dikaitkan dengan suatu variabel? Menggunakan & operator sebelum variabel menyukai pernyataan ini-

    pointer = &variable;
    
  • Bagaimana pointer digunakan dengan menunjuk ke suatu variabel? Ini juga dilakukan dengan mengawali nama dengan tanda bintang (*). Maka itu dapat digunakan di tempat variabel itu menunjuk sekarang-

    *pointer = var1 + var2;
    

    dari pada

    variable = var1 + var2;
    
  • Sekarang, mainkan dengan pointer dengan beberapa kode. Biasakan saja karakteristik pointer ini sekarang. Sampai pada titik ini, kita berbicara tentang apa yang pointer lakukan. Setelah Anda setuju, mulai belajar bagaimana pointer menunjuk ke beberapa variabel dan bagaimana mereka bereaksi jika operasi aritmatika normal diterapkan pada mereka. Lalu pergi untuk hubungan antara pointer dan array dan pointer ke pointer.

Hanya itu yang akan saya sarankan tentang petunjuk pembelajaran.

5
Gulshan

Dapatkan beberapa balok kayu.

tambahkan kait logam ke satu ujung, dan mata logam ke ujung lainnya.

anda sekarang dapat melakukan daftar tertaut dalam hal-hal yang dapat Anda mainkan.

Coba jelaskan dengan alat fisik ini. Saya sering berharap saya memiliki ini ketika mengajar petunjuk untuk siswa tahun pertama (mahasiswa baru).

Kait logam kecil adalah penunjuknya, balok kayu yang ditunjuknya.

Saya MENGHANCURKAN siapa pun untuk tidak mendapatkannya setelah bermain dengan balok.

4
Tim Williscroft

Saya membuat hidup saya lebih mudah ketika saya baru saja menghapus semua bulu dan mulai memperlakukan pointer sebagai variabel lain daripada entitas ajaib (lama di kelas 11) .. hanya tahu 3 hal:

  1. Pointer adalah variabel yang menyimpan alamat variabel lain (atau sembarang alamat).
  2. * digunakan untuk mendapatkan nilai di lokasi memori yang disimpan dalam variabel pointer.
  3. & operator memberikan alamat lokasi memori.

Sisanya adalah sintaksis gula dan akal sehat .. Hanya menulis beberapa program C sederhana (seperti menerapkan perpustakaan daftar tertaut) menggunakan pointer untuk memahami itu.

4
Sridhar Iyer

Penjelasan bahwa saya benar-benar terpesona adalah:

Pertimbangkan sebuah kotak kota dengan berbagai rumah yang dibangun di atas tanah. Di tangan Anda, Anda memegang selembar kertas. Di atas kertas yang telah Anda tulis:


Rumah David,

112 Begitu dan begitu jalan.


Potongan kertas (variabel penunjuk) berisi alamat yang menunjuk ke rumah David. Ketika Anda ingin memberi tahu seorang teman untuk melihat rumah keren David, jauh lebih mudah menggunakan pice kertas sebagai referensi ke rumah daripada mengirim bangunan berlantai dua yang sebenarnya melalui pos.

Seperti halnya pointer nyata, Anda bisa mendapat masalah saat mengikuti alamat di selembar kertas. David bisa saja bergerak dan ketika Anda sampai di sana Anda hanya menemukan lubang besar di tanah. Dalam hal ini akan lebih baik untuk menghapus alamat di atas kertas ketika David pindah atau setidaknya mengubahnya ke yang baru. Anda juga dapat menemukan bahwa Anda pergi ke alamat dan memasukkan apa yang Anda pikir adalah ruang tamu teman Anda David, tetapi kali ini Anda berakhir di kolam renang yang benar-benar asing. Orang lain telah menggunakan ruang di alamat yang Anda miliki untuk sesuatu yang sama sekali berbeda.

2
Per Wiklander
  1. Pointer dapat dianggap sebagai generalisasi indeks ke dalam array.
    • Pertimbangkan bahwa array besar dapat dipotong menjadi sejumlah array berukuran lebih kecil, tidak tumpang tindih, variabel. Sekarang, array yang lebih kecil ini adalah apa yang biasanya kita anggap sebagai array. Yang lebih besar adalah seluruh ruang memori komputer. Proses memotong array yang lebih kecil disebut alokasi memori.
  2. Seperangkat struktur yang dihubungkan bersama oleh beberapa petunjuk dapat dianggap sebagai grafik berarah .
    • Setiap dhuwur adalah variabel yang dapat menampung beberapa nilai.
    • Beberapa variabel adalah pointer, dan setiap pointer dapat memiliki tepat satu Edge yang keluar menjadi sesuatu yang lain.
    • Variabel yang bukan pointer tidak akan memiliki Edge keluar. Mereka dapat memiliki sejumlah Edge yang masuk.
2
rwong

Jika Anda ingin menjelaskan pointer Anda harus menjelaskan memori terlebih dahulu. Saya biasanya melakukannya dengan menggunakan kertas grafik/kertas kuadrat dengan baris dan kolom. Jika "siswa" mengerti ingatan dia bisa mengerti apa alamat itu. Jika Anda mendapat alamat, Anda mendapat petunjuk.

Anda dapat bermain dengan abstraksi ini. Misalnya. tulis alamat (nomor) dari satu kotak ke kotak lain. Sekarang gambar panah dari kotak pointer ke kotak tujuan. Sekarang timpa pointer (mis. Increment) dan sesuaikan panah. Tulis alamat ke kotak lain dan biarkan siswa menggambar panah ...

Langkah selanjutnya: Beri nama kotak (seperti pointer) tertentu. Sekarang Anda bisa menjelaskan dereferencing. Itu dia.

2
EricSchaefer

Saya tidak begitu ingat keadaan di sekitar pointer-aha-moment saya, tapi saya secara retroaktif mengisi memori sekitar pemahaman saya tentang array c-style. (mis. arr[3] sama dengan *(arr+3))

Untuk beberapa alasan saya merasa sangat membantu untuk melihat pointer sebagai array setiap kali saya terjadi pada situasi pointer.

2
Zaz

Pada dasarnya @Gary Rowe memperkenalkan model yang tepat. Memori sebagai satu set kotak dengan alamat (angka) di dalamnya. Setiap kotak menyimpan nilai (angka).

Ide pointer adalah menafsirkan nilai dalam satu kotak sebagai alamat kotak lain. Nilai ini digunakan untuk merujuk ke kotak tertentu, itulah sebabnya disebut referensi. Jadi dereferencing adalah proses membuka kotak yang dirujuk.

jika v adalah variabel (kotak), maka pernyataan

  • v berarti nilai v, mis. beri saya apa yang ada di dalam kotak
  • *v berarti dereferensi nilai v, mis. beri saya apa yang ada di dalam kotak yang dirujuk oleh nilai v
  • &v berarti referensi v, mis. beri saya alamat di kotak

Saya pikir itu bukan tujuan memperkenalkan server pointer sesuatu yang sama sekali berbeda. Itu adalah konsep yang sulit dipahami bagi saya ketika saya masih kecil. Itu selalu tampak seperti sihir gelap yang tidak pernah benar-benar saya pahami, yang membutuhkan banyak karakter khusus. Pertama kali saya mengerti adalah ketika saya menulis permainan kecil menggunakan tipuan ganda dalam bahasa yang tidak memiliki aritmatika pointer. Itu mencerahkan saya.

Pointer adalah masalah interpretasi. Saya pikir menjelaskan hal itu membuat banyak hal lebih mudah. Dan pointer arithmetics adalah operasi yang sangat sederhana dan intuitif jika ditunjukkan contoh sederhana dengan memori 10 variabel.

2
back2dos

Mungkin hanya saya, tetapi saya bekerja dengan baik dengan analogi. Jadi katakanlah Anda memiliki teman (fungsi/kelas) "Foo", yang ingin memiliki orang lain (fungsi/kelas yang berbeda), "Bar", menghubungi Anda untuk beberapa alasan. "Foo" bisa membawamu untuk pergi melihat "Bar", tapi itu tidak nyaman, menggerakkan semua makhluk (contoh) di sekitar. Namun, "Foo" dapat mengirim "Bar" nomor telepon Anda (pointer). Dengan begitu, di mana pun Anda berada, "Foo" tahu cara menghubungi Anda tanpa harus menemukan Anda.

Dan, katakanlah "Bar" memiliki kenalan, "Baz", yang juga ingin menghubungi Anda. Tetapi Anda protektif terhadap nomor telepon Anda dan Anda tidak ingin semua orang memilikinya, "Baz" dapat memanggil "Bar" (telepon sebagai penunjuk), yang kemudian dapat meneruskan panggilan kepada Anda (penunjuk lain). Dan seterusnya dan terus ke bawah rantai teman "Baz" dan teman dari teman.

2
Hugo

Pointer membuat cara lebih masuk akal jika Anda telah mempelajari bahasa Assembly dan/atau arsitektur komputer. Saya pikir jika saya mengajar kelas C, saya akan mulai dengan beberapa minggu arsitektur untuk menjelaskan model memori dan jenis instruksi yang sebenarnya dijalankan prosesor.

2
Barry Brown

"Aha!" momen datang dalam tutorial ini:

Tutorial tentang Pointer dan Array dalam C

Tepatnya, itu datang dalam bab ini: Bab 3: Pointer dan Strings

Untuk lebih tepatnya, itu datang dengan kalimat ini:

Parameter yang diteruskan ke puts () adalah sebuah pointer, yaitu nilai dari sebuah pointer (karena semua parameter dalam C dilewatkan oleh nilai), dan nilai sebuah pointer adalah alamat yang ditunjuknya, atau, secara sederhana, sebuah alamat .

Ketika saya membaca itu, awan membelah dan malaikat meniupkan terompet.

Karena, Anda tahu, setiap tutorial atau buku C yang saya baca sebelum yang menyatakan bahwa C dapat melewati nilai atau dengan referensi, kebohongan jahat. Yang benar adalah bahwa C selalu melewati nilai, tetapi kadang-kadang nilai yang dilewati menjadi alamat. Dalam metode ini, salinan dibuat dari alamat itu, sama seperti salinan yang akan dibuat dari int yang dilewatkan. Salinan adalah bukan dibuat dari nilai yang ditunjukkan oleh pointer. Jadi dengan menggunakan pointer di dalam metode Anda dapat mengakses nilai asli dan mengubahnya.

Saya tidak pernah menjadi pemrogram C, tetapi saya menjadi pemrogram. NET, dan objek dan referensi objek bekerja dengan cara yang sama; referensi ke objek diteruskan oleh nilai (dan karenanya disalin), tetapi objek itu sendiri tidak disalin. Saya telah bekerja dengan banyak programmer yang tidak mengerti ini karena mereka tidak pernah belajar pointer.

2
Kyralessa

Pointer adalah catatan tempel yang memberi tahu Anda di mana sesuatu yang berguna berada. Ini berisi lokasi benda itu dan memberi tahu Anda seberapa besar benda itu (dalam bahasa C, pokoknya). Jadi, penunjuk ganda seperti catatan tempel yang bertuliskan "Ada enam bungkus di lemari es". Anda harus benar-benar mendapatkan enam paket untuk mengetahui apakah itu Coke atau Budweiser.

1
philosodad

http://cslibrary.stanford.edu/

Situs ini memiliki tutorial yang bagus untuk mempelajari petunjuk dan manajemen memori.

Saya akan menyarankan Anda untuk berjalan melalui dasar-dasar petunjuk, petunjuk dan memori yang diberikan di situs. Anda juga dapat melihat masalah daftar tertaut yang diberikan pada tautan untuk lebih memperkuat konsep penunjuk.

1
deovrat singh

Diberikan kode:

int v=42; // mendeklarasikan dan menginisialisasi variabel sederhana

int *p = &v; // membuat titik p ke variabel v

Berikut ini dapat dikatakan tentang kode di atas:

int * p // "int pointer p" ... ini adalah bagaimana Anda mendeklarasikan pointer ke variabel tipe int

*p // "ditunjukkan oleh p" ... itu adalah data yang menunjuk p, sama dengan v.

&v // "alamat variabel v" ... ini mewakili nilai literal untuk p

1
zener

Kunci untuk menjelaskan petunjuk adalah memastikan bahwa orang yang Anda jelaskan, sudah memiliki pemahaman tentang konsep memori. Sementara itu akan bagus jika mereka benar-benar memahaminya level rendah, percaya bahwa memori ada sebagai array besar, dan memahami bahwa Anda dapat mengakses posisi apa pun dalam array dengan lokasi indeksnya sudah cukup.

Langkah selanjutnya, memiliki konsep melewati lokasi indeks daripada menyalin seluruh memori masuk akal bagi kebanyakan orang. Dan itu sudah cukup untuk membuat kebanyakan orang mengerti mengapa pointer berguna.

langkah terakhir untuk memahami pointer adalah menjelaskan bagaimana Anda dapat meneruskan sebagai parameter lokasi indeks memori untuk metode untuk menyimpan lokasi indeks untuk tempat semua data disimpan. Saya telah menemukan bahwa ini bisa menjadi langkah yang terlalu jauh bagi beberapa orang untuk mengatasinya.

Begitu seseorang telah memahami langkah-langkah dasar ini, langkahnya lurus ke depan bagi mereka untuk memahami bahwa Anda dapat menghubungkan pointer tanpa batas, selama Anda melacak berapa kali Anda perlu melihat alamat untuk menemukan objek data aktual.

Begitu seseorang telah memegang pointer, hal berikutnya yang harus mereka pegang dengan cepat adalah perbedaan antara heap memory dan stack memory, dan mengapa pointer ke stack memory berbahaya ketika diteruskan ke luar metode.

1
Michael Shaw

Triknya adalah untuk menjelaskan bahwa lokasi benda dan benda itu sendiri tidak sama, seperti gambar pipa bukan pipa . Ketika Anda memindahkan sesuatu, lokasinya berubah. Lokasi tetap dan beberapa hal lain dapat diletakkan di sana.

1
sal

Dengan asumsi Anda sudah memahami array setidaknya pada tingkat permukaan, penjelasan terbaik saya untuk pointer adalah sebagai berikut:

Bayangkan semua memori di komputer Anda (atau ruang alamat dalam proses Anda jika Anda ingin lebih tepat) sebagai satu array besar byte. Pointer hanyalah sebuah indeks ke dalam array itu. Pointer karenanya hanya jenis integer khusus.

Mempelajari semua trik yang dapat dilakukan C dan Assembly coders dengan memperlakukan pointer sebagai integer, dan bagaimana perbedaannya adalah konvensi murni pada tingkat bahasa Assembly, membantu memperkuat pemahaman ini untuk saya.

0
dsimcha

Ketika saya masih di universitas, profesor saya memiliki beberapa slide PowerPoint yang benar-benar rapi yang menggambarkan suatu titik sebagai variabel yang terpisah dengan panah ke lokasi memori (diwakili seperti array) dan ketika kami melakukan Linked Lists, dia akan melakukannya langkah -dengan-langkah, menunjukkan ketika panah berubah, ketika pointer dereferenced dll ..., tidak ada cara orang tidak bisa memahaminya dalam beberapa menit. Konsep itu sendiri sangat mudah, tetapi melakukannya dengan benar atau menerapkannya dalam program praktis membutuhkan lebih banyak latihan.

0
chiurox

Sebelum saya melakukan itu, saya menjelaskan bahwa dalam pemrograman "semuanya menggunakan memori", dan alokasi variabel (statis) dalam memori. Saya juga akan menjelaskan apa alamat memori itu, dan hubungan antara ruang memori, alamat memori dan variabel.

Akhirnya, saya jelaskan bahwa ada tipe data dan variabel integer, tipe data string dan variabel ... dan seterusnya, hingga menjelaskan bahwa ada tipe data khusus yang menyimpan alamat memori, yang memiliki nilai kosong seperti 0 o "", disebut null.

Dan, akhirnya, variabel yang dialokasikan secara dinamis melalui penggunaan pointer.

0
umlcat

Saya ingat buku "C puzzle" atau sejenisnya, yang saya baca murni karena itu adalah salah satu dari sedikit buku pemrograman/komputer yang tersedia di perpustakaan, pemahaman saya tentang C masih belum sempurna. Itu melemparkan C expresison pada Anda, dan meminta untuk menjelajahinya, semakin rumit.

0
peterchen