บรรทัดนี้มีความสำคัญที่สุด:
size = *(&a + 1) - a;
อย่างที่คุณเห็นขั้นแรกจะใช้ที่อยู่aและเพิ่มที่อยู่เข้าไป จากนั้นจึง dereferences ตัวชี้และลบค่าดั้งเดิมของaมัน
เลขคณิตชี้ใน C 5ทำให้เกิดนี้เพื่อกลับจำนวนขององค์ประกอบในอาร์เรย์หรือ เพิ่มหนึ่งและ&aเป็นตัวชี้ไปยังอาร์เรย์ต่อไป 5 หลังจากint aหลังจากนั้นโค้ดนี้จะยกเลิกการอ้างอิงตัวชี้ที่เป็นผลลัพธ์และลบa(ประเภทอาร์เรย์ที่สลายตัวเป็นตัวชี้) จากนั้นให้จำนวนองค์ประกอบในอาร์เรย์
รายละเอียดเกี่ยวกับการทำงานของตัวชี้ทางคณิตศาสตร์:
สมมติว่าคุณมีตัวชี้xyzที่ชี้ไปยังชนิดและมีค่าint (int *)160เมื่อคุณลบจำนวนใด ๆ ออกจากxyzC จะระบุว่าจำนวนจริงที่ลบออก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ไม่ได้ชี้ไปที่วัตถุใด ๆ ที่ถูกต้องดังนั้นจึงไม่ถูกต้อง