ที่นี่ฉันมีตัวชี้ptr
ไปยังอาร์เรย์arr
ของจำนวนเต็ม 4 ตัว ptr
ชี้ไปที่อาร์เรย์ทั้งหมด ptr[0]
หรือ*ptr
ชี้ไปที่องค์ประกอบแรกของอาร์เรย์ดังนั้นการเพิ่ม 1 เพื่อptr[0]
ให้ที่อยู่ขององค์ประกอบที่สองของอาร์เรย์
ฉันไม่เข้าใจว่าทำไมการใช้sizeof(ptr[0])
ให้ขนาดของทั้งอาร์เรย์ 16 ไบต์ไม่ใช่ขนาดขององค์ประกอบแรกเท่านั้น 4 ไบต์ (ตามที่ptr[0]
ชี้ไปที่องค์ประกอบแรกในอาร์เรย์)
int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
int *ptr = arr;
? จริงๆแล้วไม่มี int (*ptr)[4]
สร้างptr
เป็นตัวชี้ไปยังอาร์เรย์ทั้งสี่int
ค่า ไวยากรณ์ของตัวชี้แบบนั้นมีความจำเป็นในการจัดสรรอาร์เรย์จริงหลายมิติ "อาร์เรย์ 2 มิติ" ที่สร้างขึ้นด้วยmalloc()
ลูปซ้อนกันและอธิบายอย่างผิด ๆ ว่าอาร์เรย์หลายมิตินั้นเป็นอาร์เรย์พอยน์เตอร์ 1-d ไปจนถึงอาร์เรย์ 1-d หลายตัว ดูstackoverflow.com/questions/42094465/…
int *ptr = arr;
หรือ ที่จะทำให้มันชี้ไปที่จุดเริ่มต้น (องค์ประกอบแรกของ)&arr[0]
อาร์เรย์ซึ่งเทียบเท่ากับ