Yah saya harus menambahkan sesuatu juga. Struktur sedikit berbeda dari array karena array adalah pointer dan struktur tidak. Jadi hati-hati!
Katakanlah saya menulis kode yang tidak berguna ini:
#include <stdio.h>
typedef struct{
int km;
int kph;
int kg;
} car;
int main(void){
car audi = {12000, 230, 760};
car *ptr = &audi;
}
Di sini pointer ptrmenunjuk ke alamat ( ! ) Dari variabel struktur auditetapi di samping struktur alamat juga memiliki sejumlah data ( ! )! Anggota pertama dari chunk data memiliki alamat yang sama dari struktur itu sendiri dan Anda bisa mendapatkan datanya dengan hanya mereferensikan pointer seperti ini *ptr (tanpa kawat gigi) .
Tapi Jika Anda ingin acess setiap anggota lain dari yang pertama, Anda harus menambahkan penanda seperti .km, .kph, .kgyang tidak lebih dari offset ke alamat dasar potongan data ...
Tetapi karena prioritas Anda tidak dapat menulis *ptr.kgkarena operator akses .dievaluasi sebelum operator dereferensi *dan Anda akan mendapatkan *(ptr.kg)yang tidak mungkin karena pointer tidak memiliki anggota! Dan kompiler mengetahui hal ini dan karena itu akan mengeluarkan kesalahan misalnya:
error: ‘ptr’ is a pointer; did you mean to use ‘->’?
printf("%d\n", *ptr.km);
Alih-alih Anda menggunakan ini (*ptr).kgdan Anda memaksa compiler ke 1 dereference pointer dan mengaktifkan acess ke potongan data dan 2 Anda menambahkan offset (penunjuk) untuk memilih anggota.
Periksa gambar yang saya buat ini:

Tetapi jika Anda memiliki anggota bersarang, sintaks ini akan menjadi tidak dapat dibaca dan oleh karena ->itu diperkenalkan. Saya pikir keterbacaan adalah satu-satunya alasan dibenarkan untuk menggunakannya karena ini ptr->kgjauh lebih mudah untuk ditulis daripada (*ptr).kg.
Sekarang mari kita tuliskan ini secara berbeda sehingga Anda melihat hubungannya lebih jelas. (*ptr).kg⟹ (*&audi).kg⟹ audi.kg. Di sini saya pertama kali menggunakan fakta yang ptrmerupakan "alamat audi" yaitu &audidan fakta bahwa operator "referensi" & dan "dereferensi" * membatalkan satu sama lain.