หากการแสดงออก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
ขนาดของประเภทของตัวชี้
เป็นไปได้หรือไม่ที่จะเพิ่มที่อยู่และหมายเลข?
ใช่มันเป็นไปได้เพราะที่อยู่เป็นจำนวนเต็มไม่ได้ลงนามโดยทั่วไปแสดงในรูปแบบเลขฐานสิบหก