おさらい ポインタ変数を使ってデータを格納してみましょう

#include <stdio.h>


int main() {



char *a ="abc";



printf("%c\n", a[0]);

printf("%c\n", a[1]);

printf("%c\n", a[2]);

printf("%c\n", a[3]);

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

return 0;


}



ビルド実行結果

a

b

c

(空白)

abc


アレサ「このプログラムでは


ポインタ変数aを用いて文字列データ"abc"がメモリに格納されています


そのとき


a[0]

a[1]

a[2]

a[3]


には

文字データ

'a'

'b'

'c'

'\0'


が格納されています」


ソーラー「ねえ(^_-)-☆ アレサ


#include <stdio.h>


int main() {



char *a ="abc";



printf("%c\n", a[0]);

printf("%c\n", a[1]);

printf("%c\n", a[2]);

printf("%c\n", a[3]);

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

return 0;


}


ビルド実行結果

a

b

c

(空白)

abc


が実行できるのなら


ポインタ変数宣言

char *a ;

を実行して


配列変数

a[0]

a[1]

a[2]

a[3]

文字データ


'a'

'b'

'c'

'\0'




a[0]='a';

a[1]='b';

a[2]='c';

a[3]='\0';


と代入することができるんじゃないかな?」


アレサ「はい ソーラーさん


それでは そのプログラムを試しに実行してみたいと思います

👇

#include <stdio.h>


int main() {



char *a ;


a[0]='a';

a[1]='b';

a[2]='c';

a[3]='\0';


printf("%c\n", a[0]);

printf("%c\n", a[1]);

printf("%c\n", a[2]);

printf("%c\n", a[3]);

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

return 0;


}


ビルド実行結果



エラー C4700 初期化されていないローカル変数 'a' が使用されます


ソーラー「あれ?


エラー C4700 初期化されていないローカル変数 'a' が使用されます


が表示されています


ど~いうことかな?」


アレサ「つまり


ポインタ変数宣言


char *a ;


を実行するだけではだめで


ポインタ変数宣言、と同時に初期化


char *a ="abc";


を実行しなければならないというわけなのですね(^_-)-☆ 」


ソーラー「ううん


#include <stdio.h>


int main() {



char *a ="abc";



printf("%c\n", a[0]);

printf("%c\n", a[1]);

printf("%c\n", a[2]);

printf("%c\n", a[3]);

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

return 0;


}


ビルド実行結果

a

b

c

(空白)

abc


が実行できているということは


配列変数

a[0]

a[1]

a[2]

a[3]

文字データ


'a'

'b'

'c'

'\0'

が代入されているということなんだけど


逆に


char *a ;


a[0]='a';

a[1]='b';

a[2]='c';

a[3]='\0';


が実行できないのはどうなってるのかな?」


アレサ「そういえば 確かにそうですね


あっ


char *a ="abc";


では


まず


文字列データ"abc"がどこかのメモリに格納されます


そして


その文字列データ"abc"を格納しているメモリの先頭のメモリのアドレス



ポインタ変数aに格納されているので


ポインタ変数aの初期化はおこなわれていますが



aのポインタ変数宣言だけで初期化が行われない


char *a ;


だけでは


変数aが初期化されていないので


char *a ;


a[0]='a';

a[1]='b';

a[2]='c';

a[3]='\0';


は実行できないのではないですか?


Visual Studioでは変数が初期化されていない場合はプログラムを

実行できません


そして


a[0]

a[1]

a[2]

a[3]


のアドレスを格納しているポインタ変数は


ポインタ変数に数値を足し合わせるポインタ演算をもちいて


a

a+1

a+2

a+3


で表されることになりますが


ポインタ変数aは初期化されておらず


ポインタ変数aにはアドレスが代入されていないので


ポインタ変数

a

a+1

a+2

a+3


の格納しているアドレスは定まっていないことになります


つまり

配列変数

a[0]

a[1]

a[2]

a[3]

のアドレスは定まっていないことになります



ですので


a[0]='a';

a[1]='b';

a[2]='c';

a[3]='\0';


を実行しようとしても


a[0]

a[1]

a[2]

a[3]



どのメモリを管理している配列変数かさだまっていないため


a[0]='a';

a[1]='b';

a[2]='c';

a[3]='\0';


を実行しようとしても


じっこうできないわけですね。」


ソーラー「おおぅ  アレサ😊 冴えっ 冴えっ!」


それで


char *a ;


a[0]='a';

a[1]='b';

a[2]='c';

a[3]='\0';



実行できないというわけなんだね」















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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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