2009-02-24 24 views
21

क्या यह सच है, कि एस्टेरिस्क का हमेशा अर्थ है "अरे, यह एक सूचक है!" और एक सूचक हमेशा मेमोरी एड्रेस रखता है?उद्देश्य-सी में एस्टेरिक * का क्या अर्थ है?

NSString* myString; 

या

SomeClass* thatClass; 

या

(*somePointerToAStruct).myStructComponent = 5; 

:

उदाहरण के लिए (हाँ मैं अपवाद है कि एक * गणित ऑपरेशन के लिए प्रयोग किया जाता है के लिए जानते हैं) मुझे लगता है कि मैं और भी हूं Asterirsk (*) के बारे में जानने की आवश्यकता है, इससे पहले कि मैं एक वर्ग के सूचक के रूप में एक वैरिएबल को परिभाषित करते समय इसका उपयोग करता हूं।

क्योंकि कभी-कभी मैं पहले से ही पैरामीटर की घोषणा में कहता हूं कि पैरामीटर चरक एक सूचक है, और फिर भी मुझे मूल्य तक पहुंचने के लिए वेरिएबल के सामने तारांकन का उपयोग करना होगा। हाल ही में ऐसा हुआ जब मैं एक तरीके से एक विधि के एक पॉइंटर को पास करना चाहता था जैसे कि [myObj myMethod: & myStruct], मैं उस संरचना से घटक मान तक नहीं पहुंच सका, भले ही मेरी विधि घोषणा पहले से ही कहा गया है कि एक पैरामीटर है (डेमोस्ट्रक्चर *) myVar जो वास्तव में उस demostruct के लिए पहले से ही एक सूचक के रूप में जाना जाना चाहिए, अभी भी मैं हमेशा कहना था: "मैन, कंपाइलर। सुनो! यह IIISSS एक सूचक है:" और लिखें: (* myVar) .myStructComponentX = 5;

मैं वास्तव में वास्तव में समझ में नहीं आता कि मुझे दो बार क्यों कहना है। और केवल इस मामले में।

जब मैं एनएसएसटींग * myString के संदर्भ में एस्टेरिस्क का उपयोग करता हूं तो मैं केवल अपने स्ट्रिंग तक पहुंच सकता हूं, हालांकि मुझे यह पसंद है कि प्रत्येक बार यह एक सूचक है। यानी * myString = @ "yep" का उपयोग करना पसंद है।

यह मुझे कोई समझ नहीं आता है।

+0

यह है वास्तव में यह के रूप में एक सी सवाल नहीं के लिए विशिष्ट है उद्देश्य-सी :) –

+0

http://stackoverflow.com/questions/581657/why-do-i-have-to-write-mypointervar-only-s times-in-objective-c – philant

+1

का डुप्लिकेट उद्देश्य- सी स्ट्रिंग ऑब्जेक्ट के लिए नोटेशन @ "..." है। कोको में, ऐसी स्ट्रिंग ऑब्जेक्ट्स की कक्षा एनएसएसटींग है। – mouviciel

उत्तर

24

ए * वास्तव में एक सूचक को डी-रेफरेंस करने वाला ऑपरेटर है। एकमात्र समय इसका मतलब है "अरे मैं एक सूचक हूं" परिवर्तनीय घोषणा के दौरान है।

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) 
+4

इसका अर्थ घोषणा के दौरान कुछ भी अलग नहीं है - 'फू * फू' वास्तव में 'फू * फू' है, जैसा कि "' * foo' एक 'Foo'' है। यह पूरी तरह से संगत है। – andyvn22

+0

क्या इससे कोई फर्क पड़ता है कि आप घोषणापत्र के दौरान तारांकन कहां रखते हैं? अच्छा अभ्यास क्या है? (यानी 'फू * फू' और 'फू * फू') –

0

जैसा कि मैंने my answer of your previous question में कहा, @"yep" पहले से ही एक सूचक है, इसलिए myString से पहले * की कोई जरूरत नहीं है, जो भी एक सूचक है नहीं है। इस मामले में, आप पॉइंटर्स को मान नहीं देते हैं।

4

mmattax अच्छी तरह से घोषणा (एक सूचक के रूप में) और dereferencing के बीच भेद कवर किया।

हालांकि, अपनी बात के बारे में के रूप में:


    (*myVar).myStructComponentX = 5; 

एक सी struct का एक उदाहरण के एक सदस्य का उपयोग करने के (के रूप में यह है) आप आप क्या किया कर सकते हैं, या अधिक सामान्यतः आप -> संकेतन का उपयोग :


    myVar->myStructComponentX = 5; 

उद्देश्य-सी यहां थोड़ा उलझन में है क्योंकि हाल ही में (ओबीजेसी 2 में।0) की शुरुआत की संपत्ति वाक्य रचना, जिसके लिए एक शॉर्टकट है:


    int val = [myObject someIntProperty]; 

और अब के रूप में लिखा जा सकता है:


    int val = myObject.someIntProperty; 

इस उद्देश्य सी (2.0) एक संपत्ति तक पहुँचने के लिए वाक्य रचना है आप जो घोषित किया है (वास्तविक सदस्य चर नहीं), जबकि आपका उदाहरण सी संरचना के सदस्य तक पहुंच रहा था।

सुनिश्चित करें कि आप अंतर पर स्पष्ट हैं।

1

अन्य लोगों को जो मेरे जैसे ऑब्जेक्टिव-सी के लिए नए हैं के लिए, इस ट्यूटोरियल तारांकन और अन्य बुनियादी बातों को समझने में वास्तव में मददगार था:

The Beginner’s Guide to Objective-C: Language and Variables

संबंधित मुद्दे