ฉันต้องเพิ่มบางอย่างเช่นกัน โครงสร้างมีความแตกต่างเล็กน้อยเนื่องจากอาร์เรย์เป็นตัวชี้และโครงสร้างไม่ได้ ดังนั้นระวัง!
ให้บอกว่าฉันเขียนโค้ดที่ไร้ประโยชน์นี้:
#include <stdio.h>
typedef struct{
int km;
int kph;
int kg;
} car;
int main(void){
car audi = {12000, 230, 760};
car *ptr = &audi;
}
ที่นี่ตัวชี้ชี้ptrไปยังที่อยู่ ( ! ) ของตัวแปรโครงสร้างaudiแต่ข้างโครงสร้างที่อยู่ยังมีกลุ่มข้อมูล ( ! )! สมาชิกรายแรกของกลุ่มข้อมูลมีที่อยู่เดียวกันมากกว่าโครงสร้างตัวเองและคุณสามารถรับข้อมูลได้โดยการยกเลิกตัวชี้แบบนี้เท่านั้น*ptr (ไม่มีเครื่องหมายปีกกา) (ไม่มีวงเล็บ)
แต่หากคุณต้องการ acess สมาชิกอื่น ๆ ที่ไม่ใช่คนแรกที่คุณต้องเพิ่ม designator เช่น.km, .kph, .kgซึ่งเป็นอะไรมากไปกว่าการชดเชยไปยังที่อยู่ฐานของก้อนของข้อมูล ...
แต่เนื่องจากการpreceedenceคุณไม่สามารถเขียน*ptr.kgเป็นผู้ประกอบการเข้าถึง.การประเมินก่อนที่จะดำเนินการ dereference *และคุณจะได้รับ*(ptr.kg)ซึ่งเป็นไปไม่ได้เป็นตัวชี้ไม่มีสมาชิก! และคอมไพเลอร์รู้เรื่องนี้และจะออกข้อผิดพลาดเช่น:
error: ‘ptr’ is a pointer; did you mean to use ‘->’?
printf("%d\n", *ptr.km);
แต่คุณใช้สิ่งนี้(*ptr).kgและคุณบังคับให้คอมไพเลอร์ไปที่การปฏิเสธตัวชี้อันดับที่ 1และเปิดใช้งาน acess ให้กับกลุ่มข้อมูลและอันดับที่สองคุณเพิ่มออฟเซ็ต (ตัวออกแบบ) เพื่อเลือกสมาชิก
ตรวจสอบภาพนี้ฉันทำ:

แต่ถ้าคุณมีสมาชิกที่ซ้อนกันไวยากรณ์นี้จะกลายเป็นอ่านไม่ได้และดังนั้นจึง->ได้รับการแนะนำ ผมคิดว่าการอ่านเป็นเหตุผลเดียวที่สมเหตุสมผลสำหรับการใช้มันเช่นนี้ง่ายมากที่จะเขียนมากกว่าptr->kg(*ptr).kg
ตอนนี้ให้เราเขียนสิ่งนี้แตกต่างกันเพื่อให้คุณเห็นการเชื่อมต่อที่ชัดเจนยิ่งขึ้น (*ptr).kg⟹ ⟹(*&audi).kg audi.kgนี่คือครั้งแรกที่ผมใช้ความจริงที่ว่าptrเป็น"ที่อยู่ของaudi" IE &audiและความจริงที่ว่า"อ้างอิง" &และ"dereference" *ผู้ประกอบการยกเลิกการออก eachother