ポインタ
ポインタですが、慣れが必要かなぁと思っています。
ポインタは、位置情報みたいなものなので、
なんらかの値を扱う場合、変数を使いますが、
その変数は、値がメモリのどこに格納されているか示しているだけです。
値自体がその変数に格納されているわけではありません。
こう書くと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