ตัวชี้
ภาษาซีรองรับการใช้งานตัวชี้ (pointer)
ซึ่งเป็นชนิดข้อมูลสำหรับการอ้างอิงอย่างง่ายชนิดหนึ่ง
ที่เก็บบันทึกที่อยู่หรือตำแหน่งของวัตถุหรือฟังก์ชันในหน่วยความจำ ตัวชี้สามารถ อ้างอิงกลับ
(dereference) เพื่อเข้าถึงข้อมูลที่บันทึกในตำแหน่งที่ถูกชี้อยู่
หรือเพื่อเรียกใช้ฟังก์ชันที่ถูกชี้อยู่ ตัวชี้สามารถจัดดำเนินการกำหนดค่าและเลขคณิตของตัวชี้ได้ด้วย
ค่าของตัวชี้ขณะโปรแกรมทำงาน มักจะเป็นตำแหน่งมูลฐานในหน่วยความจำ
(ซึ่งอาจเสริมด้วยค่าออฟเซตในหน่วยเวิร์ด)
แต่เนื่องจากตัวชี้มีการระบุชนิดตามข้อมูลที่ชี้ไป
ตัวแปลโปรแกรมจึงสามารถตรวจสอบชนิดตัวแปรในนิพจน์ต่าง ๆ
รวมทั้งตัวชี้ด้วยกันเองขณะแปลได้ เลขคณิตของตัวชี้จะแปรสัดส่วนของขนาดโดยอัตโนมัติตามชนิดข้อมูลที่ชี้ไป
(ดูเพิ่มที่ส่วนความใช้แทนกันได้ระหว่างตัวชี้และแถวลำดับ)
จุดประสงค์ของการใช้ตัวชี้มีหลากหลายในภาษาซีเช่น
สายอักขระมักจัดดำเนินการโดยใช้ตัวชี้ไปยังแถวลำดับของตัวอักขระ การจัดสรรหน่วยความจำพลวัต
(dynamic memory allocation) สามารถกระทำได้ด้วยตัวชี้
ชนิดข้อมูลชนิดอื่นเช่น ต้นไม้
ปกติจะถูกพัฒนาขึ้นโดยการจัดสรรวัตถุ struct โดยพลวัต
ซึ่งเชื่อมโยงแต่ละหน่วยเข้ากันด้วยตัวชี้ ตัวชี้ของฟังก์ชันใช้เพื่อการเรียกกลับ
(callback) สำหรับชุดคำสั่งจัดการเหตุการณ์
เป็นต้น
ตัวชี้ว่าง (null pointer) คือตัวชี้ที่ชี้ไปยังตำแหน่งที่ใช้งานไม่ได้
ซึ่งจะมีค่าเป็น 0 [16]
การอ้างอิงกลับของตัวชี้ว่างจึงไม่มีความหมาย และโดยทั่วไปให้ผลเป็นข้อผิดพลาดขณะทำงาน
อย่างไรก็ตามตัวชี้ว่างก็มีประโยชน์สำหรับกรณีพิเศษเช่น
ใช้เป็นจุดสิ้นสุดหน่วยสุดท้ายของรายการโยง
ซึ่งหมายความว่าไม่มีตัวชี้ไปหน่วยอื่นแล้ว
หรือใช้แจ้งข้อผิดพลาดจากฟังก์ชันที่คืนค่าเป็นตัวชี้
ตัวชี้ว่างในการลงรหัสมักจะนำเสนอด้วย 0 หรือ NULL
ตัวชี้วอยด์ (void *)
คือตัวชี้ของวัตถุที่ไม่ทราบชนิดตัวแปร ดังนั้นจึงสามารถใช้เป็นตัวชี้
"ทั่วไป" ก็ได้ แต่เนื่องจากขนาดและชนิดของวัตถุที่ถูกชี้ไม่เป็นที่ทราบ
ตัวชี้วอยด์จึงไม่สามารถอ้างอิงกลับได้
และเลขคณิตของตัวชี้ก็ใช้กับตัวชี้วอยด์ไม่ได้
แม้ว่าตัวชี้ของวัตถุชนิดหนึ่งอาจแปลงเป็นตัวชี้ชนิดอื่นได้โดยง่าย
(และในหลายบริบทก็แปลงได้อย่างคลุมเครือ)
การใช้งานตัวชี้อย่างไม่ระมัดระวังอาจเกิดอันตรายได้
เนื่องจากตัวแปรตัวชี้สามารถชี้ไปที่ตำแหน่งใดก็ได้โดยไม่มีกฎเกณฑ์
และปกติก็ไม่มีการตรวจสอบ ซึ่งอาจทำให้เกิดผลกระทบที่ไม่พึงปรารถนา
ถึงแม้ตัวชี้ที่ใช้งานอย่างถูกต้องได้ชี้ไปยังตำแหน่งที่ปลอดภัยอยู่แล้ว
แต่มันก็อาจถูกทำให้ชี้ไปยังตำแหน่งที่ไม่ปลอดภัยโดยการดำเนินการเลขคณิตที่ไม่ถูกต้อง
หรือตัวชี้ไปยังวัตถุที่อาจเรียกคืนการจัดสรรไปแล้วแต่ถูกเรียกใช้ใหม่ (ตัวชี้อย่างหลวม
dangling pointer) หรือตัวชี้ที่อาจใช้งานโดยไม่กำหนดค่าเริ่มต้น
(ตัวชี้ตัวแทน
wild pointer) หรือตัวชี้ที่อาจถูกกำหนดด้วยค่าที่ไม่ปลอดภัยโดยตรง
ด้วยวิธีโยนชนิดตัวแปร ยูเนียน หรือผ่านค่ามาจากตัวชี้อื่นที่เสีย เป็นต้น
โดยทั่วไปภาษาซีอนุญาตให้จัดดำเนินการและแปลงชนิดตัวแปรของตัวชี้ได้
แม้ว่าตัวแปลโปรแกรมก็มีตัวเลือกสำหรับการตรวจสอบอยู่หลายระดับก็ตาม
ภาษาโปรแกรมอื่นบางภาษาจัดการปัญหานี้โดยกำหนดให้ใช้ชนิดตัวแปรอ้างอิงที่เคร่งครัดมากกว่า
ไม่มีความคิดเห็น:
แสดงความคิดเห็น