こんな子いるかな? char* p;を実行した後 p[0],p[1],p[2]を用いて文字列データをメモリに格納することはできません
Visual Studio 2018では ポインタ変数を使って文字列データをメモリに格納することができますが
Visual Studio 2019では ポインタ変数を使って文字列データをメモリに格納することはできません
ソーラー「なんと
配列を使って文字列データをメモリに
格納する方法以外に
ポインタ変数を使って文字列データをメモリに
格納する方法があるんだね
ポインタ変数を使って文字列データをメモリに
格納する方法はこちらです
👇
#include <stdio.h>
int main(void) {
char* p ="abc";
printf("%c\n", p[0]);
printf("%c\n", p[1]);
printf("%c\n", p[2]);
printf("%c\n", p[3]);
printf("%s\n", p);
printf("%p\n", p);
return 0;
}
ビルド実行結果
a
b
c
(空白となります)
abc
002E7B30
ソーラー「ポインタ変数を使って
文字列データ"abc"をメモリに
格納するとき
メモリに格納された文字データ
'a'
'b'
'c'
'\0'
は
p[0]
p[1]
p[2]
p[3]
をもちいてあらわすことができました
それならば
char* p;
を実行して
p[0]='a';
p[1]='b';
p[2]='c';
p[3]='\0';
を実行することにより
文字データ
'a'
'b'
'c'
'\0'
をメモリに格納できるのではないか?
と思われる方がおられるかもしれません
ですがそのようなことはできません
そのことを示すプログラムはこちらです
👇
#include <stdio.h>
int main(void) {
char* p ;
p[0]='a';
p[1]='b';
p[2]='c';
p[3]='\0';
printf("%c\n", p[0]);
printf("%c\n", p[1]);
printf("%c\n", p[2]);
printf("%c\n", p[3]);
printf("%s\n", p);
printf("%p\n", p);
return 0;
}
コンパイル結果(EAZY IDECの場合)
続行するには何かキーを押して下さい. . .
Visual Studioの場合
ビルド実行結果
エラー C4700 初期化されていないローカル変数 'p' が使用されます
ソーラー「EAZY IDECを用いて
プログラムを実行した場合
コマンドプロンプト画面に何も表示されていませんね
Visual Studioを用いて
プログラムを実行した場合
エラー C4700 初期化されていないローカル変数 'p' が使用されます
が表示されます
char* p;
を実行して
p[0]='a';
p[1]='b';
p[2]='c';
p[3]='\0';
を実行することにより
文字データ
'a'
'b'
'c'
'\0'
をメモリに格納することはできないのですね
なぜ このようなことがおきるのか?
それは
🍋char* p;🍋
を実行しただけでは
ポインタ変数は初期化されず
ポインタ変数pにはアドレスは代入されません
ポインタ変数pにアドレスが代入されないとなると
pに[]演算子を用いた
p[0]
p[1]
p[2]
p[3]
は
どのアドレスのメモリにアクセスしたらいい変数なのか
定まらないということになります
どのアドレスのメモリにアクセスしたらいい変数なのか
定まらない
p[0]
p[1]
p[2]
p[3]
には
p[0]='a';
p[1]='b';
p[2]='c';
p[3]='\0';
のようにデータが代入できないというわけです
それに対し
char p[4];
のように
pの配列宣言を実行し
配列変数
p[0]
p[1]
p[2]
p[3]
を生成した場合は
p[0]='a';
p[1]='b';
p[2]='c';
p[3]='\0';
を実行して
文字データ
'a'
'b'
'c'
'\0'
を
メモリに
格納することができます
char p[4];
を実行したときは
それだけで
ポインタ変数pにある定まったアドレスが代入されているので
配列変数
p[0]
p[1]
p[2]
p[3]
は
どのアドレスのメモリにアクセスしたらいい変数なのか
定まることになります
ですので
p[0]='a';
p[1]='b';
p[2]='c';
p[3]='\0';
が実行できるのですね
(実際には
char* p="abc" ;
と
char p[4];
p[0]='a';
p[1]='b';
p[2]='c';
p[3]='\0';
の仕組みはことなっています
後ほど その例をご説明いたしますね(^_^)/」
その時のプログラムはこちらです
👇
#include <stdio.h>
int main(void) {
char p[4];
p[0] = 'a';
p[1] = 'b';
p[2] = 'c';
p[3] = '\0';
printf("%c\n", p[0]);
printf("%c\n", p[1]);
printf("%c\n", p[2]);
printf("%c\n", p[3]);
printf("%s\n", p);
printf("%p\n", p);
return 0;
}
ビルド実行結果
a
b
c
(空白となっています)
abc
006FFEA0
ソーラー「
ポインタ変数を使って
💖char* p = "abc";💖
を実行して
文字列データ"abc"をメモリに格納した場合は
💖ポインタ変数pに💖
💖文字列データ"abc"を格納しているメモリ領域の先頭のメモリのアドレスが💖
💖代入されます💖
p[0]
p[1]
p[2]
p[3]
はどのメモリにアクセスしていいかわかることになります
ですので
p[0] = 'a';
p[1] = 'b';
p[2] = 'c';
p[3] = '\0';
を実行することができ
p[0]
p[1]
p[2]
p[3]
を用いて
printf("%c\n", p[0]);
printf("%c\n", p[1]);
printf("%c\n", p[2]);
printf("%c\n", p[3]);
を実行し
文字データ
'a'
'b'
'c'
'\0'
を格納したメモリ
にアクセスし
コマンドプロンプト画面に
a
b
c
(空白)
を表示することができます
ですが
さらに
p[0]
p[1]
p[2]
p[3]
を用いて
p[0] = 'd';
p[1] = 'e';
p[2] = 'f';
p[3]='\0';
を実行して
文字データ
'd'
'e'
'f'
'\0'
を
メモリに格納することはできません
そのことを示すプログラムは次のようになります
👇
#include <stdio.h>
int main(void) {
char* p = "abc";
printf("%c\n", p[0]);
printf("%c\n", p[1]);
printf("%c\n", p[2]);
printf("%c\n", p[3]);
printf("%s\n", p);
printf("%p\n", p);
p[0] = 'd';
p[1] = 'e';
p[2] = 'f';
p[3] = '\0';
printf("%c\n", p[0]);
printf("%c\n", p[1]);
printf("%c\n", p[2]);
printf("%c\n", p[3]);
printf("%s\n", p);
printf("%p\n", p);
return 0;
}
ビルド実行結果
a
b
c
abc
(空白です)
00917B30
続行するには何かキーを押して下さい . . .
アレサ「
a
b
c
abc
(空白です)
00917B30
までは
直ぐに実行結果が表示されるのですが
続行するには何かキーを押して下さい . . .
が表示されるまで
大分時間がかかっています
p[0] = 'd';
p[1] = 'e';
p[2] = 'f';
p[3]='\0';
printf("%c\n", p[0]);
printf("%c\n", p[1]);
printf("%c\n", p[2]);
printf("%c\n", p[3]);
printf("%s\n", p);
printf("%p\n", p);
は実行されていないので何も表示されません」
ソーラー「
char* p = "abc";
を実行して
ポインタ変数pには
💖文字列データ"abc"を格納しているメモリ領域の先頭のメモリのアドレスが💖
💖代入されて💖
p[0]
p[1]
p[2]
p[3]
がアクセスするメモリが定まっているのに
p[0] = 'd';
p[1] = 'e';
p[2] = 'f';
p[3]='\0';
が実行できないなんて
おっかしいなあ😊
なんでこんな仕組みになっているんだろう?」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます