ポインタ変数をつかって文字列データがメモリに格納されたとき最後に文字列データが格納されたメモリのアドレスがポインタ変数に代入されます その様子を観察してみましょう🍓

ソーラー「さあ、それでは


ポインタ変数をつかって文字列データがメモリに格納されたとき


最後に文字列データが格納されたメモリのアドレスが


ポインタ変数に代入されるんだけど


その様子を観察してみよう。


アレサ ポインタ変数稼働だ」


#include <stdio.h>


int main(void) {


char *hairetu ;


hairetu = "neko";

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

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

hairetu = "nyao";

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

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


hairetu = "myao";

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

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


hairetu = "syao";

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

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


hairetu = "cyao";

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

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


return 0;


}


コンパイル結果


EAZY IDECの場合

neko

00402000

nyao

0040200D

myao

0040201A

syao

00402027

cyao

00402034



Visual Studioの場合

neko

000F7CE0

nyao

000F7BE0

myao

000F7BE8

syao

000F7BF0

cyao

000F7B34



ソーラー「このプログラムでは


まず

char *hairetu ;

により


ポインタ変数hairetuが作成されています


そして


ポインタ変数hairetuをつかって文字列データがメモリに格納されたとき


最後に文字列データが格納されたメモリのアドレスが


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


Visual Studioの場合


文字列データ"neko"が


ポインタ変数hairetuに格納されたなら


文字列データ"neko"が格納されたメモリのアドレスが


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


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


が実行されると


nekoがコマンドプロンプト画面に表示され


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


が実行されると


文字列データ"neko"が格納されたメモリのアドレス


000F7CE0


がコマンドプロンプト画面に表示されます。



次に


文字列データ"nyao"が


ポインタ変数hairetuに格納されたなら


文字列データ"nyao"が格納されたメモリのアドレスが


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


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


が実行されると


nyaoがコマンドプロンプト画面に表示され


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


が実行されると


文字列データ"nyao"が格納されたメモリのアドレス


000F7BE0


がコマンドプロンプト画面に表示されます。



次に



文字列データ"myao"が


ポインタ変数hairetuに格納されたなら


文字列データ"myao"が格納されたメモリのアドレスが


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


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


が実行されると


myaoがコマンドプロンプト画面に表示され


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


が実行されると


文字列データ"myao"が格納されたメモリのアドレス


000F7BE8


がコマンドプロンプト画面に表示されます。



次に



文字列データ"syao"が


ポインタ変数hairetuに格納されたなら


文字列データ"syao"が格納されたメモリのアドレスが


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


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


が実行されると


syaoがコマンドプロンプト画面に表示され


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


が実行されると


文字列データ"syao"が格納されたメモリのアドレス


000F7BF0


がコマンドプロンプト画面に表示されます。



次に



文字列データ"cyao"が


ポインタ変数hairetuに格納されたなら


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


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


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


が実行されると


cyaoがコマンドプロンプト画面に表示され


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


が実行されると


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


000F7834


がコマンドプロンプト画面に表示されます。」


ソーラー「ねえ、アレサ


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


文字列データ

"neko"

"nyao"

"myao"

"syao"

"cyao"



どんどこメモリに格納したんだけど


文字列データ

"neko"

"nyao"

"myao"

"syao"

"cyao"


を格納しているメモリのアドレスは


000F7CE0

000F7BE0

000F7BE8

000F7BF0

000F7B34


となっていて


全然順序良く並んでいないね。


000F7CE0より256大きい数値が


000F7BE0で


000F7BE0より8大きい数値が


000F7BE8で


000F7BE8より8大きい数値が


000F7BF0で


000F7BF0より206小さい数値が


000F7B34


となっているね。


(´▽`*)/

ははっ



本当に



どんどこ


適当に


文字列データ

"neko"

"nyao"

"myao"

"syao"

"cyao"


をメモリに格納したみたいだ。」



アレサ「統合開発環境Visual Studioでは


同じ名前で配列宣言を行うことができないので

できませんが


統合開発環境EAZY IDECをもちいて


char hairetu[]を使って


文字列データ

"neko"

"nyao"

"myao"

"syao"

"cyao"

をメモリに格納してみると


#include <stdio.h>


int main(void) {


char hairetu[]= "neko";

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

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

char hairetu[]= "nyao";

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

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


char hairetu[]= "myao";

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

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


char hairetu[]= "syao";

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

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


char hairetu[]="cyao";

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

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


return 0;


}


コンパイル結果


neko

0019FF53

nyao

0019FF4E

myao

0019FF49

syao

0019FF44

cyao

0019FF3F


アレサ「このようにコンパイル結果が表示されますが


このとき


文字列データ

"neko"

"nyao"

"myao"

"syao"

"cyao"

を格納しているメモリのアドレス


0019FF53

0019FF4E

0019FF49

0019FF44

0019FF3F


にご注目ください。


5ずつ

アドレス番号が小さくなりながらならんでいるのがわかります。


つまりポインタ変数を使って文字列データを格納するときと違い


文字列データ

"neko"

"nyao"

"myao"

"syao"

"cyao"

連続したメモリに格納されているのがわかりますの」


ソーラー「ここらあたりが


配列を使って文字列データを格納するとき


ポインタ変数を使って文字列データを格納するときの違いかな😊」



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

作者を応援しよう!

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

応援したユーザー

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