บรรทัดนี้มีความสำคัญที่สุด:
size = *(&a + 1) - a;
อย่างที่คุณเห็นขั้นแรกจะใช้ที่อยู่a
และเพิ่มที่อยู่เข้าไป จากนั้นจึง dereferences ตัวชี้และลบค่าดั้งเดิมของa
มัน
เลขคณิตชี้ใน C 5
ทำให้เกิดนี้เพื่อกลับจำนวนขององค์ประกอบในอาร์เรย์หรือ เพิ่มหนึ่งและ&a
เป็นตัวชี้ไปยังอาร์เรย์ต่อไป 5 หลังจากint
a
หลังจากนั้นโค้ดนี้จะยกเลิกการอ้างอิงตัวชี้ที่เป็นผลลัพธ์และลบa
(ประเภทอาร์เรย์ที่สลายตัวเป็นตัวชี้) จากนั้นให้จำนวนองค์ประกอบในอาร์เรย์
รายละเอียดเกี่ยวกับการทำงานของตัวชี้ทางคณิตศาสตร์:
สมมติว่าคุณมีตัวชี้xyz
ที่ชี้ไปยังชนิดและมีค่าint
(int *)160
เมื่อคุณลบจำนวนใด ๆ ออกจากxyz
C จะระบุว่าจำนวนจริงที่ลบออกxyz
คือจำนวนนั้นคูณด้วยขนาดของประเภทที่ชี้ไป ตัวอย่างเช่นถ้าคุณหักออก5
จากxyz
ค่าของxyz
ที่เกิดจะเป็นxyz - (sizeof(*xyz) * 5)
ถ้าคำนวณตัวชี้ไม่ได้ใช้
เนื่องจากa
เป็นอาร์เรย์5
int
ประเภทค่าผลลัพธ์จะเป็น 5 อย่างไรก็ตามสิ่งนี้จะใช้ไม่ได้กับตัวชี้เฉพาะกับอาร์เรย์เท่านั้น 1
ถ้าคุณพยายามที่นี้กับตัวชี้ผลที่ได้จะเป็น
นี่คือตัวอย่างเล็กน้อยที่แสดงที่อยู่และวิธีการที่ไม่ได้กำหนดไว้ ด้านซ้ายมือจะแสดงที่อยู่:
a + 0 | [a[0]] | &a points to this
a + 1 | [a[1]]
a + 2 | [a[2]]
a + 3 | [a[3]]
a + 4 | [a[4]] | end of array
a + 5 | [a[5]] | &a+1 points to this; accessing past array when dereferenced
ซึ่งหมายความว่ารหัสถูกลบa
จาก&a[5]
(หรือa+5
) 5
ทำให้
โปรดทราบว่านี่เป็นพฤติกรรมที่ไม่ได้กำหนดและไม่ควรใช้ในสถานการณ์ใด ๆ อย่าคาดหวังว่าพฤติกรรมนี้จะสอดคล้องกันในทุกแพลตฟอร์มและอย่าใช้ในโปรแกรมการผลิต
&a + 1
ไม่ได้ชี้ไปที่วัตถุใด ๆ ที่ถูกต้องดังนั้นจึงไม่ถูกต้อง