Soru Asterisk * Objective-C'de ne anlama geliyor?


Asterisk'in her zaman "Hey, bu bir işaretçidir" anlamına geldiği doğru mu? Ve bir İşaretçi her zaman bir hafıza adresi tutar?

(Evet, matematik işleminde * kullanıldığı istisna için biliyorum)

Örneğin:

NSString* myString;

veya

SomeClass* thatClass;

veya

(*somePointerToAStruct).myStructComponent = 5;

Asterirsk (*) hakkında bir sınıfa işaret eden bir değişken tanımlarken kullandığımdan daha fazla bilmem gerektiğini hissediyorum.

Çünkü bazen parametre parametresinin bir işaretçi olduğunu beyan ettim ve yine de değere erişmek için Yıldız işaretini Değişken'in önünde kullanmak zorundayım. Son zamanlarda, bir metodun bir metodun bir metodunu [myObj myMethod: & myStruct] gibi bir yöntemle iletmek istediğimde gerçekleştiğimde, metod beyanımın zaten bir parametre olduğunu söylemesine rağmen, bu yapıdan bir bileşen değerine erişemedim ( DemoStruct *) myVar aslında bu demostruct bir işaretçi olarak bilinmelidir, hala ben her zaman vardı: "Man, derleyici. Dinle! It IISSSS bir işaretçi:" ve yazmak: (* myVar) .myStructComponentX = 5;

Bunu gerçekten neden iki kez söylemem gerektiğini gerçekten anlamıyorum. Ve sadece bu durumda.

Asterisk'i bir NSString * myString bağlamında kullandığımda, myString'e ancak, her zaman bir işaretçiyi belirtmeden derleyiciye söylemeden erişebilirim. yani * myString = @ "yep" komutunu kullanmak gibi.

Benim için hiçbir şey ifade etmiyor.


21
2018-02-24 13:19


Menşei


Bu, Objective-C'ye özgü olmayan bir C sorusudur :) - Tamas Czinege
kopyası stackoverflow.com/questions/581657/... - philant
Objective-C'ye özgü olan, bir string nesnesi için "..." notasyonu. Kakao'da, bu tür dize nesnelerinin sınıfı NSString'dir. - mouviciel


Cevaplar:


Bir * aslında bir işaretçiyi referans almak için bir operatördür. "Hey ben bir işaretçiyim" anlamına gelen tek zaman, değişken bildirim sırasında.

Foo* foo  // declare foo, a pointer to a Foo object
&foo      // the memory address of foo
*foo      // de-reference the pointer - gives the Foo object (value)

25
2018-02-24 13:31



Deklarasyon sırasında farklı bir şey ifade etmiyor--Foo* foo aslında Foo *foo, de olduğu gibi, "*foo bir Foo"Tamamen tutarlı. - andyvn22
Beyan sırasında yıldız koyduğunuz yer önemli mi? İyi uygulama nedir? (Yani Foo* foo ve Foo *foo) - Sung Won Cho


mmattax, deklarasyon (işaretçi olarak) ve dereferencing arasındaki farkı tamamladı.

Ancak, konuyla ilgili olarak:


  (*myVar).myStructComponentX = 5;

C yapısına ait bir örneğe erişmek için (olduğu gibi) yaptığınız şeyi yapabilir veya daha yaygın olarak -> notasyonu:


  myVar->myStructComponentX = 5;

Objektif-C biraz kafa karıştırıcı, çünkü yakın zamanda (ObjC 2.0) özellik sözdizimi, kısaca aşağıdakiler için:


  int val = [myObject someIntProperty];

ve şimdi şöyle yazılabilir:


  int val = myObject.someIntProperty;

Bu, bildirdiğiniz bir özelliğe (gerçek bir üye değişkeni değil) erişmek için Objective C (2.0) sözdizimi, örneğiniz bir C yapısının üyesine erişiyordu.

Farkın açık olduğundan emin ol.


4
2018-02-24 13:44





Benim gibi Objective-C için yeni olan diğer insanlar için, bu öğretici yıldız ve diğer temelleri anlamada gerçekten yardımcı oldu:

Başlangıç ​​Cetveli Objektif-C: Dil ve Değişkenler


1
2018-02-02 11:13





Söylediğim gibi önceki sorunun cevabım, @"yep" zaten bir işaretçi, bu yüzden gerek yok * önce myString Bu da bir işaretçi. Bu durumda, değerler değil işaretçiler atarsınız.


0
2018-02-24 13:29