2009-02-24 12 views
21

アスタリスクは常に「ねえ、それはポインタです!」という意味ですか? そして、ポインタは常にメモリアドレスを保持していますか?Objective-Cのアスタリスク*は何を意味していますか?

NSString* myString; 

または

SomeClass* thatClass; 

または

(*somePointerToAStruct).myStructComponent = 5; 

は、例えば

(はい、私は*が数学の操作に使用されていることを例外に知っています)私はもっ​​と私がいると感じるクラスへのポインタである変数を定義するときに使用するよりも、Asterirsk(*)について知る必要があります。

パラメータの宣言でパラメータ変数がポインタであると言うことがありますが、依然として値にアクセスするために変数の前にアスタリスクを使用する必要があるためです。最近私は、[myObj myMethod:& myStruct]のような方法で構造体のポインタをメソッドに渡したかったのですが、メソッド宣言ですでにパラメータがあると言っていましたが、その構造体からコンポーネントの値にアクセスできませんでした(DemoStruct *)myVarは実際にそのdemostructへのポインタとして既に知られているはずですが、私はいつも言っていました: "男、コンパイラ、Listen:ItISISSのポインタ:"と書く:(* myVar).myStructComponentX = 5;

本当に本当に本当に私はなぜそれを2回言わなければならないのか分かりません。そして、この場合のみ。

NSString * myStringのコンテキストでアスタリスクを使用すると、私はmyStringにアクセスすることができますが、ポインタを指定するたびにコンパイラに指示することなく、好きです。つまり、* myString = @ "yep"を使用するようなものです。

それはちょうど私には意味がありません。

+0

それが固有ではありませんので、これは実際にはCの質問ですObjective-C :) –

+0

複製のhttp://stackoverflow.com/questions/581657/why-do-i-have-to-write-mypointervar-only-sometimes-in-objective-c – philant

+1

Objective- Cは、文字列オブジェクトの表記@ "..."です。 Cocoaでは、このような文字列オブジェクトのクラスはNSStringです。 – mouviciel

答えて

24

anは、実際にはポインタを参照解除する演算子です。唯一の時間は、 "私はポインタです"という意味です。変数宣言中です。

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'は実際には' Foo * foo'です。 '' * foo'は 'Foo'です。それは完全に一貫しています。 – andyvn22

+0

宣言時にアスタリスクをどこに配置するかは重要ですか?良い練習は何ですか? (すなわち、 'Foo * foo'と' Foo * foo') –

0

私がmy answer of your previous questionに言ったように、@"yep"はすでにポインタなので、またポインタであるmyString*の必要はありません。この場合、値ではなくポインタを割り当てます。

4

mmattaxは、(ポインタとしての)宣言と逆参照の区別を十分に網羅しています。

しかし、あなたのポイントの約として:(これがあるとして)


    (*myVar).myStructComponentX = 5; 

はあなたが何をしたか行うことができますCの構造体のインスタンスのメンバーにアクセスするための、またはより一般的にあなたが->表記を使用:


    myVar->myStructComponentX = 5; 

Objective-Cは最近(ObjC 2では)混乱しています。


    int val = [myObject someIntProperty]; 

、今のように記述することができます:


    int val = myObject.someIntProperty; 

これはプロパティにアクセスするためのObjective C(2.0)構文である0)のための近道ですプロパティの構文を導入(実際のメンバ変数ではなく)宣言しましたが、あなたの例はC構造体のメンバにアクセスしていました。

違いが明確であることを確認してください。私のようなObjective-Cのに慣れてい他の人のために