คำถามติดแท็ก pointers

ชนิดข้อมูลที่ "ชี้ไปที่" ค่าอื่นเก็บไว้ในหน่วยความจำ ตัวแปรตัวชี้ประกอบด้วยที่อยู่หน่วยความจำของเอนทิตีอื่น ๆ (ตัวแปรหรือฟังก์ชันหรือเอนทิตีอื่น ๆ ) แท็กนี้ควรใช้สำหรับคำถามที่เกี่ยวข้องกับการใช้พอยน์เตอร์ไม่ใช่การอ้างอิง ภาษาโปรแกรมที่ใช้กันทั่วไปโดยใช้พอยน์เตอร์คือภาษา C, C ++, Go และภาษาแอสเซมบลี ใช้แท็กภาษาเฉพาะ แท็กที่เป็นประโยชน์อื่น ๆ คือวิธีการฟังก์ชั่น struct ฯลฯ อธิบายการใช้ตัวชี้

1
ตัวชี้ไปยังชนิดที่ไม่สมบูรณ์สามารถไม่สมบูรณ์ได้หรือไม่?
สามารถint (*)[]จะเป็นประเภทที่ไม่สมบูรณ์? C 2018 6.2.5 1 พูดว่า: ณ จุดต่าง ๆ ภายในหน่วยการแปลประเภทของวัตถุอาจไม่สมบูรณ์ (ขาดข้อมูลเพียงพอที่จะกำหนดขนาดของวัตถุประเภทนั้น) หรือสมบูรณ์ (มีข้อมูลเพียงพอ) ดังนั้นจึงดูเหมือนว่าถ้าขนาดของประเภทเป็นที่รู้จักประเภทจะเสร็จสมบูรณ์ 6.2.6.1 28 ระบุว่าพอยน์เตอร์บางประเภทต้องมีขนาดเท่ากัน (พอยน์เตอร์voidและตัวอักษร, พอยน์เตอร์ไปยังประเภทที่เข้ากันได้, พอยน์เตอร์ไปยังโครงสร้างและพอยน์เตอร์เป็นสหภาพ) แต่พอยน์เตอร์ ในการนำ C ไปใช้งานที่ตัวชี้ทั้งหมดหรือตัวชี้ทั้งหมดไปยังอาร์เรย์intมีขนาดเท่ากันแล้วขนาดint (*)[]เป็นที่รู้จักดังนั้นจึงจะสมบูรณ์ ในการใช้งานที่กล่าวว่าใช้ตัวชี้ที่แตกต่างกันสำหรับอาร์เรย์ขนาดใหญ่ขนาดจะไม่เป็นที่รู้จักดังนั้นจึงไม่สมบูรณ์ เมื่อMM ชี้ให้เห็นโครงสร้างจะต้องไม่มีสมาชิกที่มีชนิดไม่สมบูรณ์ยกเว้นสมาชิกอาร์เรย์สุดท้ายที่ยืดหยุ่นตามข้อ จำกัด ใน 6.7.2.1 3. สิ่งนี้ชี้ให้เห็นว่าการนำไปปฏิบัติที่มีพอยน์เตอร์ขนาดเดียวต้องยอมรับstruct { int (*p)[]; }ในขณะที่การนำไปใช้ที่แตกต่างกัน ขนาดสำหรับอาร์เรย์ดังกล่าวจะต้องวินิจฉัยการละเมิดข้อ จำกัด (นี่หมายความว่าคำประกาศดังกล่าวไม่ได้เป็นส่วนหนึ่งของการปฏิบัติตามค. อย่างเคร่งครัด)

4
ขนาดของการทำงานกับ dereferencing ตัวชี้ไปยังอาร์เรย์นี้ได้อย่างไร
ที่นี่ฉันมีตัวชี้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
9 c  arrays  pointers 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.