Perangkap kaedah panggilan dengan penunjuk?

WBOY
Lepaskan: 2024-02-09 18:06:08
ke hadapan
534 orang telah melayarinya

Perangkap kaedah panggilan dengan penunjuk?

Dalam pengaturcaraan PHP, penunjuk ialah alat berkuasa yang boleh digunakan untuk merujuk alamat memori pembolehubah dan kemudian mengubah suai nilai pembolehubah. Walau bagaimanapun, mungkin terdapat beberapa perangkap dan masalah apabila memanggil kaedah dengan penunjuk, yang perlu ditangani dengan berhati-hati. Dalam artikel ini, editor PHP Banana akan memperkenalkan secara terperinci perangkap kaedah panggilan penunjuk untuk membantu pembangun mengelakkan kesilapan biasa dan masalah yang tidak perlu. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini akan memberi anda bimbingan dan nasihat praktikal. Mari terokai kelemahan kaedah panggilan penunjuk dan tingkatkan kemahiran pengaturcaraan kami!

Kandungan soalan

Saya sedang menulis pelaksanaan tentang 2-3-4 pokok. Struktur nod adalah seperti berikut

type Node struct {
    items  []int
    childs []*Node
    parent *Node
}
Salin selepas log masuk

Saya keliru dengan kod di bawah. Nampaknya kedua-dua bahagian ini melakukan perkara yang sama. Walau bagaimanapun, Salah satunya salah.

  • Kod yang betul
cur = cur.parent
cur._insertNode(upTo, rn)
upTo, rn = cur._splitNode()
Salin selepas log masuk
  • Ralat kod
cur.parent._insertNode(upTo, rn)
upTo, rn = cur.parent._splitNode()
cur = cur.parent
Salin selepas log masuk

Boleh sesiapa beritahu saya apa perbezaannya?

Apa yang saya jangkakan ialah penjelasan mengenai isu ini. Adakah ini perangkap kaedah penunjuk Go? Atau ralat pengkompil?

Penyelesaian

Andaikan C ialah nod yang cur pada asalnya ditunjuk, cur原来指向的节点,AC原来的父节点,假设对 _insertNodeA ialah nod induk asal C, dengan anggapan bahawa panggilan ke _insertNode</code > akan berada dalam Sisipkan nod baharu </em>B<em> antara </em>A</p> dan <p>C</p> jadi, kita mulakan di sini: <p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">A | C</pre><div class="contentsignin">Salin selepas log masuk</div></div> </p> (ditambah nod lain, tidak berkaitan dengan pandangan saya): <p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">A | B | C</pre><div class="contentsignin">Salin selepas log masuk</div></div> <code>_insertNode之前,C的父级是A;调用 _insertNode (ditambah nod lain, masih tidak relevan dengan pandangan saya). Perlu diambil perhatian bahawa sebelum memanggil _insertNode, induk C ialah

A

; selepas memanggil _insertNode, induk

C

ialah

B

.

🎜Dengan mengambil kira perkara itu, inilah "kod yang betul" anda, bersama-sama dengan ulasan yang menerangkan perkara yang dilakukan: 🎜
// initially, cur = C

// set cur = A:
cur = cur.parent

// insert B between A and C:
cur._insertNode(upTo, rn)

// cur is still A

// split A:
upTo, rn = cur._splitNode()
Salin selepas log masuk
🎜Berikut ialah "kod ralat" anda, serta ulasan yang menerangkan perkara yang dilakukannya: 🎜
// initially, cur = C

// insert B between A and C:
cur.parent._insertNode(upTo, rn)

// cur.parent is now B

// split B:
upTo, rn = cur.parent._splitNode()

// set cur = B:
cur = cur.parent
Salin selepas log masuk
🎜Adakah anda melihatnya? 🎜

Atas ialah kandungan terperinci Perangkap kaedah panggilan dengan penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!