ポインタ

ポインタですが、慣れが必要かなぁと思っています。
ポインタは、位置情報みたいなものなので、
なんらかの値を扱う場合、変数を使いますが、
その変数は、値がメモリのどこに格納されているか示しているだけです。
値自体がその変数に格納されているわけではありません。
こう書くとJavaとか大体一緒ぽく聞こえてくる気がする。
だいたい、同じ様な感じなので...Javaとかも実際はポインタ使ってる。
ただメモリとか意識させないようになってるだけだだし。
それで、Javaとか違って、変数の扱いが少し違います。
ポインタを使うには、ポインタ変数を宣言しないといけません。

 int *ptr1; ← ポインタ変数

上の状態だと、まだアドレスは、格納されていません。
ポインタ変数は、*付けて扱う場合と*付けないで扱う場合で違います。
*付けない状態で扱う場合は、アドレスで、*付けて扱う場合は、値を操作することになります。

 int *ptr1; 
 int data = 100;
 ptr1 = &data;  ←  アドレスとを設定
 NSLog(@"address:%p", ptr1);  ←  アドレスを表示
 NSLog(@"value  :%d", *ptr1);  ←  値を表示

実行すると下みたいな感じになります。

 address:0x7fff6120e864
 value  :100

下みたい感じで書くとします。

 int *ptr2;
 ptr2 = ptr1;  ←  アドレスを設定
 *ptr2 = 200;  ←  値を設定
 NSLog(@"value  :%d", *ptr1);  ← 200が表示されます。

ptr1もptr2も同じアドレスなので、ptr2が指している場所にある値を変更すると
ptr1も変わります。
intなどの普通の型でもオブジェクトでも考え方は一緒です。
オブジェクトの場合は、変数の扱いは、Javaとかと一緒です。
特に、*ありなしは意識しません...たぶん。
下のような感じになります。

 NSString *str1 = @"test1";
 NSString *str2 = str1;
 NSLog(@"str1 : %p", str1);
 NSLog(@"str2 : %p", str2);
 NSLog(@"str1 : %@", str1);
 NSLog(@"str2 : %@", str2);

実行結果

 str1 : 0x102e330a0
 str2 : 0x102e330a0
 str1 : test1
 str2 : test1