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

Visual Studio2019以降のヴァージョンではポインタ変数を使って文字列データをメモリに格納する機能は削除されています ご注意ください





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


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


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


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


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


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


#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



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


まず


hairetuのchar*型のポインタ変数宣言


char* hairetu;

により


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


そして


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


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


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


(Visual Studioの場合)


hairetu = "neko";


のように


文字列データ"neko"が


ポインタ変数hairetuに代入されたなら


実際には


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


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


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


が実行されると


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


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


が実行されると


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


000F7CE0



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



次に


hairetu = "nyao";


のように


文字列データ"nyao"が


ポインタ変数hairetuに代入されたなら


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


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


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


が実行されると


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


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


が実行されると


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


000F7BE0



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



次に


hairetu = "myao";


のように


文字列データ"myao"が


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


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


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


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


が実行されると


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


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


が実行されると


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


000F7BE8


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



次に


hairetu = "syao";


のように


文字列データ"syao"が


ポインタ変数hairetuに代入されたなら


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


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


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


が実行されると


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


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


が実行されると


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


000F7BF0



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



次に


hairetu = "cyao";


のように


文字列データ"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より188小さい数値が


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"

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


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


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


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



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る