พอยน์เตอร์มีปัญหาหลายอย่าง:
- aliasingความเป็นไปได้ของการเปลี่ยนค่าของวัตถุโดยใช้ชื่อ / ตัวแปรต่างกัน
- Non-ท้องที่ความเป็นไปได้ของการเปลี่ยนค่าวัตถุในบริบทที่แตกต่างจากที่มันถูกประกาศ (สิ่งนี้เกิดขึ้นกับข้อโต้แย้งที่ส่งผ่านโดยการอ้างอิง)
- อายุการใช้งานไม่ตรงกันอายุการใช้งานของตัวชี้อาจแตกต่างจากอายุการใช้งานของวัตถุที่ชี้ไปและอาจนำไปสู่การอ้างอิงที่ไม่ถูกต้อง (SEGFAULTS) หรือขยะ
- ชี้เลขคณิต ภาษาการเขียนโปรแกรมบางภาษาอนุญาตให้จัดการพอยน์เตอร์เป็นจำนวนเต็มและนั่นหมายความว่าพอยน์เตอร์สามารถชี้ได้ทุกที่ (รวมถึงสถานที่ที่ไม่คาดคิดที่สุดเมื่อมีบั๊ก) ในการใช้ตัวชี้ทางคณิตศาสตร์อย่างถูกต้องโปรแกรมเมอร์ต้องระวังขนาดหน่วยความจำของวัตถุที่ชี้ไปและนั่นเป็นสิ่งที่คิดมาก
- Type Castsความสามารถในการร่ายพอยน์เตอร์จากประเภทหนึ่งไปยังอีกประเภทหนึ่งช่วยให้สามารถเขียนทับหน่วยความจำของวัตถุที่แตกต่างจากที่ตั้งใจไว้ได้
นั่นเป็นสาเหตุที่โปรแกรมเมอร์ต้องคิดให้ละเอียดยิ่งขึ้นเมื่อใช้พอยน์เตอร์ (ฉันไม่รู้เกี่ยวกับนามธรรมสองระดับ ) นี่คือตัวอย่างของข้อผิดพลาดทั่วไปที่ทำโดยสามเณร:
Pair* make_pair(int a, int b)
{
Pair p;
p.a = a;
p.b = b;
return &p;
}
โปรดทราบว่ารหัสเช่นด้านบนมีเหตุผลอย่างสมบูรณ์ในภาษาที่ไม่มีแนวคิดเกี่ยวกับพอยน์เตอร์ แต่เป็นชื่อ (การอ้างอิง), วัตถุและค่า, เป็นภาษาโปรแกรมที่ใช้งานได้และภาษาที่มีการรวบรวมขยะ (Java, Python) .
ความยากลำบากกับการทำงาน recursive ที่เกิดขึ้นเมื่อคนที่ไม่มีพื้นฐานทางคณิตศาสตร์พอ (ที่ recursiveness เป็นปกติและความรู้ที่จำเป็น) พยายามที่จะเข้าใกล้พวกเขาคิดว่าการทำงานจะทำงานแตกต่างกันขึ้นอยู่กับว่าหลายครั้งที่จะได้รับการเรียกก่อน ปัญหานั้นรุนแรงขึ้นเพราะฟังก์ชั่นวนซ้ำสามารถสร้างขึ้นในรูปแบบที่คุณต้องคิดด้วยวิธีนั้นเพื่อทำความเข้าใจกับมัน
คิดถึงฟังก์ชั่นวนซ้ำด้วยพอยน์เตอร์ที่ถูกส่งผ่านไปเช่นในการดำเนินการตามขั้นตอนของต้นไม้สีแดงดำซึ่งมีการปรับเปลี่ยนโครงสร้างข้อมูลในสถานที่ มันเป็นสิ่งที่ยากมากที่จะคิดเกี่ยวกับกว่าคู่ทำงาน
มันไม่ได้เป็นที่กล่าวถึงในคำถาม แต่ปัญหาที่สำคัญอื่น ๆ ที่สามเณรมีความยากลำบากเป็นเห็นพ้องด้วย
ดังที่คนอื่น ๆ ได้กล่าวถึงมีปัญหาเพิ่มเติมที่ไม่ใช่แนวคิดเกี่ยวกับการสร้างภาษาการเขียนโปรแกรมบางอย่าง: แม้ว่าเราจะเข้าใจความผิดพลาดที่เรียบง่ายและซื่อสัตย์กับโครงสร้างเหล่านั้นอาจเป็นเรื่องยากมากที่จะดีบั๊ก