【iPhoneアプリ】これを使いこなさないと「*(ポインタ)」について ポインタ変数編
今回は、「*(ポインタ)」についてです。
やはり、ここも押さえとかないとObjective-cを
使いこなすのは難しそうなので記載して行きます。
今回も2部構成で、ポインタ変数編と汎用ポインタ編を記載します。
*(ポインタ)について
ポインタ変数とは、メモリーを管理する為の手法です。
通常の変数は、値を代入すると
以下のようにメモリーに実数値が格納されます。
プログラムでこんな感じに書いて
int object1 = 100; int object2 = 200;
格納イメージはこんな感じです。
次にポインタ変数を使って、値を代入してみます。
ここで「アドレス変数」と「ポインタ変数」を使って、以下のように記載します。
プログラムでこんな感じで書いて
int object1 = 100; int *object2; object2 = &object1; NSLog(@"値1:%d",*object2);
宣言部分の説明になります。
この記述により
下記の図のように値が格納され、実数値を取り出す事が可能となります。
※また、このような書き方も出来るようですが、どのように
格納されるのか不明です。
ポインタ変数の特徴
ポインタ変数は「値の格納先アドレス」が格納されています。
その事により、「変数のアドレス」を「書き換える事」により、別のアドレスの値を
参照することが可能となります。
以下の図ような感じなります。
ポインタ変数の応用
次に配列とインスタンス時の場合のポインタ変数について記載して行きます。
配列のポインタ変数
通常の「ポインタ無し配列」の場合、以下のようにプログラムを記述します。
char object[] = "string"; NSLog(@"ポインタ無し_配列の値:%s",object);
次に「「ポインタあり配列」の場合、以下のようにプログラムを記述します。
char object[] = "string"; char *p_object; p_object = &object[0]; //先頭のアドレスを参照 NSLog(@"配列の値_0:%s",p); //参照先のアドレスを変更 NSLog(@"配列の値_0:%s",p++); NSLog(@"配列の値_0:%s",p++);
このプログラムのイメージは以下のような感じです。
まずは、宣言部分のイメージ
次に値を表示部分の「参照先のアドレスを変更」時のイメージです。
また、以下のプログラムのように参照時に「*(ポインタ)」を付けると
そのアドレスの値のみを参照出来ます。
char object[] = "string"; char *p_object; p_object = &object[0]; //先頭のアドレスを参照 NSLog(@"配列の値_0:%s",p); //参照先のアドレスを変更 NSLog(@"配列の値_0:%s",*p++); NSLog(@"配列の値_0:%s",*p++);
「*(ポインタ)」を追加した表示部分の「参照先のアドレスを変更」時のイメージです。
インスタンス時のポインタ変数
クラスをインスタンスする際に以下のようなプログラムを書きます。
Object *obj; obj = [[Object alloc] init];
インスタンス時のイメージです。
次回は、C言語で利用される「汎用ポインタ」について記載します。