ポインタ変数は1番最後にポインタ変数を使って文字列データを格納したメモリのアドレスを格納するために存在します。 そして文字列データをメモリに格納するためのポインタ変数名はなんでもよいのです

ポインタ変数hairetuは1番最後にポインタ変数hairetuを使ってデータを格納したメモリのアドレスを格納します。文字列データをメモリに格納するためのポインタ変数名はなんでもよいのです

ソーラー「どうやら


ポインタ変数の根本にして最大の特徴


が示されたわけだね。



配列と違いポインタ変数はポインタ変数名を変更しなくても文字列データを

      

        💖どんどこどんどこ💖


メモリに格納することができます



アレサ「そう(*´▽`*)そうなのですの(´▽`*)/」


ソーラー「さっきのプログラムを見てよ。


#include <stdio.h>


int main(void){


char *hairetu="neko";


hairetu="nyao";

hairetu="myao";

hairetu="syao";

hairetu="cyao";


printf("%s\n",hairetu);


return 0;

}


コンパイル結果


EAZY IDECの場合

cyao


Visual Studioの場合

cyao


あるいは

ポインタ変数宣言、初期化の命令文


char *hairetu="neko";


を分割して記述してみるとこうなるかな?


hairetuのポインタ変数宣言


char *hairetu;


を実行し


ポインタ変数hairetuを作製してから


ポインタ変数hairetuに


文字列データ

"neko"

"nyao";

"myao";

"syao";

"cyao";



を代入すると・・・



#include <stdio.h>


int main(void){


char *hairetu;


hairetu="neko";


hairetu="nyao";

hairetu="myao";

hairetu="syao";

hairetu="cyao";


printf("%s\n",hairetu);


return 0;

}


コンパイル結果


EAZY IDECの場合

cyao


Visual Studioの場合

cyao


ソーラー「


このプログラムが実行されると


文字列データ

"nyao"

"myao"

"syao"

"cyao"


はすべて別々のメモリに格納されていたんだ。」


(もちろんプログラムの実行後はコンピュータのメモリから


文字列データ

"nyao"

"myao"

"syao"

"cyao"


は消えてしまいます。


                 solarplexussより)


アレサ「つまり


ポインタ変数宣言

char *hairetu;


を行って


ポインタ変数hairetuを作製して


hairetu="neko";

hairetu="nyao";

hairetu="myao";

hairetu="syao";

hairetu="cyao";


のように


文字列データを代入していくと


💖どんぶらこどんどこ💖 💖どんぶらこどんどこ💖


       💖別々のメモリに💖


文字列データ


"neko";

"nyao";

"myao";

"syao";

"cyao";


が格納されていくわけですね。


そして


最後にhairetu="cyao";


によって


文字列データ"cyao"が


メモリに格納されるのですが


その文字列データ"cyao"を格納したメモリのアドレスが


ポインタ変数hairetuに格納されるのですの。」



ソーラー「ここで面白いと思うのは


ポインタ変数hairetuは


ポインタ変数名をhairetuからかえることなく


文字列データを別々のメモリに格納できるということだね。


さらにいうと


文字列データをメモリに格納するのに


ポインタ変数名は何でもいいということなんだ


単に


ポインタ変数hairetuは


1番最後に


ポインタ変数hairetuをつかって


文字列データを格納したメモリのアドレスを


格納するために存在しているんだね


だから必ずポインタ変数名をhairetuにする必要はなく


文字列データをメモリに格納するための


ポインタ変数名はなんでもよい


ということなんだ。


たとえば


ポインタ変数名をhairetuからaにかえて


先程のプログラムを実行しても


#include <stdio.h>


int main(void) {


char *a;


a = "neko";


a = "nyao";

a = "myao";

a = "syao";

a = "cyao";


printf("%s\n", a);


return 0;

}


コンパイル結果

cyao


ソーラー「もちろん


このように


メモリに


文字列データ


"neko";

"nyao";

"myao";

"syao";

"cyao";


💖どんぶらこどんぶらこ💖


と格納できるし


さらに・・・」


アレサ「さらに😊・・・」


ソーラー「文字列データを格納するたびに


ポインタ変数を変更したりしなかったりすることもできるんだ。


#include <stdio.h>


int main(void) {


char *hairetu;


hairetu = "neke";


hairetu = "neko";


char *str;


str = "nyao";


char *ars;


ars = "myao";


char *sol;


sol = "syao";


char *arr;


arr = "cyao";


printf("%s\n", hairetu);

printf("%s\n", str);

printf("%s\n", ars);

printf("%s\n", sol);

printf("%s\n", arr);


return 0;

}

コンパイル結果

neko

nyao

myao

syao

cyao


ソーラー「最後に文字列データを格納したメモリのアドレスが


それぞれのポインタ変数に格納されるので


ポインタ変数hairetuには


文字列データ

"neke"

でなく


最後に

文字列データ

"neko"

を格納したメモリのアドレスが


ポインタ変数strには

文字列データ

"nyao"

を格納したメモリのアドレスが


ポインタ変数arsには

文字列データ

"myao"

を格納したメモリのアドレスが


ポインタ変数solには

文字列データ

"syao"

を格納したメモリのアドレスが


ポインタ変数arrには

文字列データ

"cyao"

を格納したメモリのアドレスが


格納されることになるんだね。


ポインタ変数名がhairetuのままではできなかったけど


このようにポインタ変数名を


文字列データをメモリに格納するたびに


ちゃんと


hairetu

str

ars

sol

arr

と変更したなら


printf("%s\n", hairetu);

printf("%s\n", str);

printf("%s\n", ars);

printf("%s\n", sol);

printf("%s\n", arr);


を実行して


neko

nyao

myao

syao

cyao

をコマンドプロンプト画面に表示することができるね。」



アレサ「ふう お見事です。ソーラーさん」


  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます