ゆるい感じのプログラムを書きたい。

プログラムの敷居を下げて、多くの人が開発出来るように色々書いていきます!

【iPhoneアプリ】これを使いこなさないと「*(ポインタ)」について ポインタ変数編

今回は、「*(ポインタ)」についてです。

やはり、ここも押さえとかないとObjective-c
使いこなすのは難しそうなので記載して行きます。

今回も2部構成で、ポインタ変数編汎用ポインタ編を記載します。

*(ポインタ)について

ポインタ変数とは、メモリーを管理する為の手法です。


通常の変数は、値を代入すると
以下のようにメモリー実数値が格納されます。


プログラムでこんな感じに書いて

int object1 = 100;
int object2 = 200;


格納イメージはこんな感じです。

f:id:kassans:20140318180424p:plain

次にポインタ変数を使って、値を代入してみます。
ここで「アドレス変数」と「ポインタ変数」を使って、以下のように記載します。


プログラムでこんな感じで書いて

int object1 = 100;
int *object2;
object2 = &object1;

NSLog(@"値1:%d",*object2);


宣言部分の説明になります。

f:id:kassans:20140318180422p:plain

この記述により
下記の図のように値が格納され、実数値を取り出す事が可能となります。

f:id:kassans:20140318182135p:plain



※また、このような書き方も出来るようですが、どのように
格納されるのか不明です。

f:id:kassans:20140318181021p:plain

ポインタ変数の特徴

ポインタ変数は「値の格納先アドレス」が格納されています。

その事により、「変数のアドレス」を「書き換える事」により、別のアドレスの値
参照することが可能となります。


以下の図ような感じなります。

f:id:kassans:20140318181011p:plain

ポインタ変数の応用

次に配列インスタンス時の場合ポインタ変数について記載して行きます。


配列のポインタ変数


通常の「ポインタ無し配列」の場合、以下のようにプログラムを記述します。

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


このプログラムのイメージは以下のような感じです。


まずは、宣言部分のイメージ

f:id:kassans:20140318181008p:plain


次に値を表示部分の「参照先のアドレスを変更」時のイメージです。

f:id:kassans:20140318181013p:plain


また、以下のプログラムのように参照時に「*(ポインタ)」を付けると
そのアドレスの値のみを参照出来ます。

char object[] = "string";
char *p_object;
p_object = &object[0];

//先頭のアドレスを参照
NSLog(@"配列の値_0:%s",p);

//参照先のアドレスを変更
NSLog(@"配列の値_0:%s",*p++);
NSLog(@"配列の値_0:%s",*p++);


*(ポインタ)」を追加した表示部分の「参照先のアドレスを変更」時のイメージです。

f:id:kassans:20140318181014p:plain


インスタンス時のポインタ変数


クラスをインスタンスする際に以下のようなプログラムを書きます。

Object *obj;
obj = [[Object alloc] init];


インスタンス時のイメージです。


f:id:kassans:20140318181010p:plain


次回は、C言語で利用される「汎用ポインタ」について記載します。