おさらい ポインタ変数を使ってデータを格納してみましょう
#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';
は
実行できないというわけなんだね」
」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます