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 ptr
adresini ( ! ) 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
, .kg
daha taban adresine uzaklıklar daha hiçbir şey hangi verinin yığın ...
Ancak önkoşul nedeniyle, *ptr.kg
eriş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).kg
ve 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->kg
yazmaktan ç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 ptr
bir olan "adresi audi
" yani &audi
ve gerçeği "referans" &
ve "KQUEUE" *
operatörler birbirinden out iptal edin.