หากการแสดงออกtype name[count]ถูกเขียนในฟังก์ชั่นบางอย่างแล้วคุณบอกให้คอมไพเลอร์ C เพื่อจัดสรรบนสแต็กเฟรมsizeof(type)*countไบต์และคำนวณที่อยู่ขององค์ประกอบแรกในอาร์เรย์
หากการแสดงออกtype name[count]ถูกเขียนนอกฟังก์ชั่นและคำจำกัดความของโครงสร้างทั้งหมดแล้วคุณบอกให้คอมไพเลอร์ C เพื่อจัดสรรในsizeof(type)*countไบต์ส่วนข้อมูลและคำนวณที่อยู่ขององค์ประกอบแรกในอาร์เรย์
nameที่จริงแล้วคือวัตถุคงที่ที่เก็บที่อยู่ขององค์ประกอบแรกในอาร์เรย์และทุกวัตถุที่เก็บที่อยู่ของหน่วยความจำบางอย่างเรียกว่าตัวชี้ดังนั้นนี่คือเหตุผลที่คุณปฏิบัติต่อnameเป็นตัวชี้มากกว่าอาร์เรย์ โปรดทราบว่าอาร์เรย์ใน C สามารถเข้าถึงได้ผ่านตัวชี้เท่านั้น
ถ้าcountเป็นนิพจน์ค่าคงที่ที่ประเมินค่าเป็นศูนย์คุณจะบอกให้คอมไพเลอร์ C จัดสรรศูนย์ไบต์ทั้งในสแต็กเฟรมหรือส่วนข้อมูลและส่งคืนที่อยู่ขององค์ประกอบแรกในอาร์เรย์ แต่ปัญหาในการทำเช่นนี้คือองค์ประกอบแรก ไม่มีอาร์เรย์ที่มีความยาวเป็นศูนย์และคุณไม่สามารถคำนวณที่อยู่ของสิ่งที่ไม่มีอยู่ได้
นี่คือเหตุผลที่องค์ประกอบที่ไม่มี count+1ไม่มีอยู่ในcountอาร์เรย์ความยาวดังนั้นนี่คือเหตุผลที่คอมไพเลอร์ C ห้ามมิให้กำหนดอาร์เรย์ที่มีความยาวเป็นศูนย์เป็นตัวแปรทั้งในและนอกฟังก์ชันเนื่องจากเนื้อหาnameนั้นเป็นอย่างไร ที่อยู่ใดที่nameเก็บอย่างแน่นอน
ถ้าpเป็นตัวชี้แสดงว่านิพจน์p[n]นั้นเทียบเท่า*(p + n)
ในกรณีที่ * ดอกจันในการแสดงออกที่เหมาะสมคือการดำเนินการ dereference ของตัวชี้ซึ่งหมายถึงการเข้าถึงหน่วยความจำที่ชี้โดยp + nหรือการเข้าถึงหน่วยความจำที่มีอยู่จะถูกเก็บไว้ในp + nที่p + nแสดงออกชี้ก็จะใช้เวลาที่อยู่ของpและเพิ่มที่อยู่นี้จำนวนnคูณ pขนาดของประเภทของตัวชี้
เป็นไปได้หรือไม่ที่จะเพิ่มที่อยู่และหมายเลข?
ใช่มันเป็นไปได้เพราะที่อยู่เป็นจำนวนเต็มไม่ได้ลงนามโดยทั่วไปแสดงในรูปแบบเลขฐานสิบหก