ตัวดำเนินการ -> ในฟังก์ชัน malloc

ดูที่นี่:

struct mystruct{
 int a;
 int b;
};

int main(void){
 struct mystruct* ptr;
 ptr = malloc( 10*sizeof( struct mystruct ) );

ด้วยวิธีนี้ฉันได้จัดสรรอาร์เรย์ของโครงสร้าง หากคุณพยายามพิมพ์ เช่น ptr[4] คุณจะสังเกตเห็นตัวชี้ เมื่อฉันมีพอยน์เตอร์และเข้าถึงสมาชิกได้ ฉันต้องใช้ตัวดำเนินการ -> ใช่ไหม? แต่ถ้าฉันทำ:

ptr[4]->a

มันไม่ทำงาน! ฉันต้องทำ

ptr[4].a 

เพื่อให้มันได้ผล... เพราะอะไร? ฉันมีตัวชี้! ptr[4] = (ptr+4) ใช่ไหม?

ในอาร์เรย์ปกติสิ่งนี้จะเกิดขึ้นเช่นกัน:

struct mystruct array[10];
array[4].a

แต่อาร์เรย์เป็นตัวชี้!


person AlessandroF    schedule 10.03.2017    source แหล่งที่มา
comment
หากคุณพยายามพิมพ์ เช่น ptr[4] คุณจะสังเกตเห็นพอยน์เตอร์ - ไม่ คุณจะไม่ (ขึ้นอยู่กับว่าคุณพยายามพิมพ์สิ่งนั้นอย่างไร) ptr[4] เป็นประเภท struct mystruct ไม่ใช่ตัวชี้   -  person davmac    schedule 10.03.2017
comment
ptr[4] = (ptr+4) ใช่ไหม? ผิด! ptr[4] คือ *(ptr+4) สังเกตว่า *? ptr[4] ไม่ใช่ตัวชี้   -  person AnT    schedule 10.03.2017
comment
คุณจัดสรรอาร์เรย์ struct mystruct ไม่ใช่อาร์เรย์ struct mystruct *... และ [ ] ออฟเซ็ต และการอ้างอิง โดยให้โครงสร้างในอาร์เรย์ ไม่ใช่ตัวชี้ไป   -  person Dmitri    schedule 10.03.2017
comment
นอกจากนี้อาร์เรย์ไม่ใช่ตัวชี้จริงๆ (แม้ว่าคุณจะสามารถใช้วงเล็บการจัดทำดัชนีกับตัวชี้ได้เช่นกัน) อาร์เรย์ที่นี่คือกลุ่มของโครงสร้างที่คุณจัดสรร ไม่ใช่ตัวชี้ที่บอกคุณว่าโครงสร้างเหล่านั้นอยู่ที่ไหน   -  person Dmitri    schedule 10.03.2017
comment
แต่อาร์เรย์เป็นตัวชี้ - ไม่!   -  person too honest for this site    schedule 10.03.2017


คำตอบ (3)


array[4] ไม่ เหมือนกับ array + 4 มันเหมือนกับ *(array + 4)

array + 4 เป็นตัวชี้อย่างแน่นอน แต่ array[4] เป็นค่าที่ตัวชี้ชี้ไป (ซึ่งแน่นอนว่าอาจเป็นตัวชี้ด้วยหาก array เป็นอาร์เรย์ของตัวชี้บางประเภท)

เนื่องจากโดยพื้นฐานแล้ว x->y นั้นเหมือนกับ (*x).y คุณจึงสามารถเขียน array[4].a ใหม่เป็น (array + 4)->a ได้ แต่คุณจะมีเวลาที่ยากลำบากในการรับผู้ตรวจสอบโค้ดที่ผ่านมาส่วนใหญ่

person rici    schedule 10.03.2017

เมื่อคุณใช้วงเล็บเหลี่ยมบนตัวชี้ จะคล้ายกับการลดการอ้างอิงจุดนั้น ดังนั้นจึงขอไวยากรณ์ p[].a ไม่ใช่ p[]->a

(p + 4)->a is essentially the same as p[4].a
person Nova Ardent    schedule 10.03.2017

ถ้า ptr มีประเภท struct mystruct * ดังนั้น ptr[i] มีประเภท struct mystruct; IOW, ptr[i] ไม่ใช่ค่าตัวชี้ ดังนั้น คุณจึงจำเป็นต้องใช้ตัวดำเนินการเลือกส่วนประกอบ . แทน ->

person John Bode    schedule 10.03.2017