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 ptr
menunjuk ke alamat ( ! ) Dari variabel struktur audi
tetapi 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
, .kg
yang tidak lebih dari offset ke alamat dasar potongan data ...
Tetapi karena prioritas Anda tidak dapat menulis *ptr.kg
karena 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).kg
dan 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->kg
jauh 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 ptr
merupakan "alamat audi
" yaitu &audi
dan fakta bahwa operator "referensi" &
dan "dereferensi" *
membatalkan satu sama lain.