ฉันต้องเพิ่มบางอย่างเช่นกัน โครงสร้างมีความแตกต่างเล็กน้อยเนื่องจากอาร์เรย์เป็นตัวชี้และโครงสร้างไม่ได้ ดังนั้นระวัง!
ให้บอกว่าฉันเขียนโค้ดที่ไร้ประโยชน์นี้:
#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