Ben de bir şeyler eklemeliyim. Dizi bir işaretçi olduğu ve yapı olmadığı için yapı diziden biraz farklıdır. Yani dikkatli ol!
Diyelim ki bu işe yaramaz kod parçasını yazıyorum:
#include <stdio.h>
typedef struct{
int km;
int kph;
int kg;
} car;
int main(void){
car audi = {12000, 230, 760};
car *ptr = &audi;
}
Burada işaretçi yapı değişkeninin ptradresini ( ! ) Gösterir,audi ancak adres yapısının yanında da bir veri kümesi ( ! ) Vardır ! Veri yığınının ilk üyesi, yapının kendisiyle aynı adrese sahiptir ve yalnızca böyle bir işaretçiyi kaydırarak *ptr (parantez olmadan) verilerini alabilirsiniz .
Eğer birincisinden daha başka üyesini erişmesine istiyorsanız Ama, böyle bir planlayýcýsý eklemek zorunda .km, .kph, .kgdaha taban adresine uzaklıklar daha hiçbir şey hangi verinin yığın ...
Ancak önkoşul nedeniyle, *ptr.kgerişim operatörü .dereference operatörü önce değerlendirildiğinde yazamazsınız *ve *(ptr.kg)işaretçinin üyesi olmadığı için mümkün olmaz! Derleyici bunu bilir ve bu nedenle bir hata verir:
error: ‘ptr’ is a pointer; did you mean to use ‘->’?
printf("%d\n", *ptr.km);
Bunun yerine bunu kullanırsınız (*ptr).kgve derleyiciyi işaretçiyi 1. referanstan ayırmaya zorlar ve veri yığınına erişim sağlar ve 2. üyeyi seçmek için bir ofset (işaretleyici) eklersiniz.
Yaptığım bu görüntüyü kontrol et:

Ancak yuvalanmış üyeleriniz varsa, bu sözdizimi okunamaz hale gelir ve bu nedenle ->tanıtılır. Bence okunabilirlik onu kullanmak için sadece haklı bir sebep, çünkü bu ptr->kgyazmaktan çok daha kolay (*ptr).kg.
Şimdi bağlantıyı daha net görebilmeniz için bunu farklı yazalım. (*ptr).kg⟹ (*&audi).kg⟹ audi.kg. İşte ilk gerçeğini kullanılan ptrbir olan "adresi audi" yani &audive gerçeği "referans" & ve "KQUEUE" * operatörler birbirinden out iptal edin.