ฉันมีความยินดีที่จะอธิบายพอยน์เตอร์ให้กับการเขียนโปรแกรม C และเริ่มสะดุดเมื่อมีปัญหาต่อไปนี้ อาจไม่เหมือนปัญหาเลยถ้าคุณรู้วิธีใช้ตัวชี้ไปแล้ว แต่ลองดูตัวอย่างต่อไปนี้ด้วยใจที่ชัดเจน:
int foo = 1;
int *bar = &foo;
printf("%p\n", (void *)&foo);
printf("%i\n", *bar);
สำหรับผู้เริ่มต้นการส่งออกอาจจะน่าแปลกใจ ในบรรทัดที่ 2 เขา / เธอเพิ่งประกาศ * bar ให้เป็น & foo แต่ในบรรทัดที่ 4 ปรากฎว่า * bar นั้นเป็น foo แทนที่จะเป็น & foo!
ความสับสนคุณอาจพูดว่าเกิดจากความกำกวมของสัญลักษณ์ *: ในบรรทัดที่ 2 มันถูกใช้เพื่อประกาศพอยน์เตอร์ ในบรรทัดที่ 4 จะใช้เป็นตัวดำเนินการ unary ซึ่งดึงค่าจุดตัวชี้ที่ สองสิ่งที่แตกต่างใช่มั้ย
อย่างไรก็ตาม "คำอธิบาย" นี้ไม่ได้ช่วยผู้เริ่มต้นเลย มันแนะนำแนวคิดใหม่โดยชี้ให้เห็นความแตกต่างที่ละเอียดอ่อน นี่ไม่ใช่วิธีที่ถูกต้องในการสอน
ดังนั้น Kernighan และ Ritchie อธิบายได้อย่างไร
ตัวดำเนินการ unary * เป็นตัวดำเนินการทางอ้อมหรือการยกเลิกการลงทะเบียน เมื่อนำไปใช้กับตัวชี้มันเข้าถึงวัตถุที่ตัวชี้ชี้ไปที่ [ ... ]
การประกาศของตัวชี้ ip
int *ip
นั้นมีวัตถุประสงค์เพื่อช่วยในการจำ มันบอกว่าการแสดงออก*ip
เป็น int ไวยากรณ์ของการประกาศสำหรับการเลียนแบบตัวแปรไวยากรณ์ของการแสดงออกในการที่ตัวแปรอาจปรากฏ
int *ip
ควรอ่านเช่น " *ip
จะคืนค่าint
" หรือไม่ แต่ทำไมการมอบหมายหลังจากประกาศไม่เป็นไปตามรูปแบบนั้น ถ้าผู้เริ่มต้นต้องการเริ่มต้นตัวแปร? int *ip = 1
(อ่าน: *ip
จะส่งคืนint
และint
เป็น1
) จะไม่ทำงานตามที่คาดไว้ โมเดลเชิงแนวคิดดูเหมือนจะไม่สอดคล้องกัน ฉันทำอะไรบางอย่างหายไปหรือเปล่า
*
ในการประกาศเป็นความหมายโทเค็น "ประกาศตัวชี้" ในการแสดงออกมันเป็นผู้ดำเนินการอ้างอิงและทั้งสองแสดงสิ่งต่าง ๆ ที่มีสัญลักษณ์เดียวกัน (เหมือนกับตัวดำเนินการคูณ - สัญลักษณ์เดียวกันความหมายต่างกัน) มันสับสน แต่สิ่งที่แตกต่างจากสภาพของกิจการที่แท้จริงจะยิ่งแย่ลงไปอีก
int* bar
ทำให้ชัดเจนยิ่งขึ้นว่าดาวนั้นเป็นส่วนหนึ่งของชนิดไม่ใช่ส่วนของตัวระบุ หลักสูตรนี้จะทำงานให้คุณเข้าสู่ปัญหาที่แตกต่างกับสิ่งที่ unintuitive int* a, b
เช่น
*
สามารถมีสองความหมายที่แตกต่างกันขึ้นอยู่กับบริบท เช่นเดียวกับตัวอักษรเดียวกันสามารถออกเสียงได้แตกต่างกันขึ้นอยู่กับคำที่มันทำให้ยากที่จะเรียนรู้ที่จะพูดหลายภาษา หากทุกแนวคิด / การดำเนินการมีสัญลักษณ์ของตัวเองเราต้องการแป้นพิมพ์ขนาดใหญ่กว่ามากดังนั้นสัญลักษณ์จะถูกนำกลับมาใช้ใหม่เมื่อเหมาะสม
int* p
) ในขณะที่เตือนนักเรียนของคุณไม่ให้ใช้การประกาศหลายรายการในบรรทัดเดียวกันเมื่อพอยน์เตอร์เกี่ยวข้อง เมื่อนักเรียนเข้าใจแนวคิดของพอยน์เตอร์ได้อย่างครบถ้วนให้อธิบายให้นักเรียนฟังว่าint *p
ไวยากรณ์นั้นเทียบเท่ากันแล้วอธิบายปัญหาด้วยการประกาศหลายครั้ง