🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
こんな子いるかな? char* p;を実行した後 p[0],p[1],p[2]を用いて文字列データをメモリに格納することはできません
こんな子いるかな? char* p;を実行した後 p[0],p[1],p[2]を用いて文字列データをメモリに格納することはできません
ソーラー「なんと
配列を使って文字列データをメモリに
格納する方法以外に
ポインタ変数を使って文字列データをメモリに
格納する方法があるんだね
ポインタ変数を使って文字列データをメモリに
格納する方法はこちらです
👇
#include <iostream>
using namespace std;
int main() {
char* p ="abc";
cout << p[0] << "\n";
cout << p[1] << "\n";
cout << p[2] << "\n";
cout << p[3] << "\n";
cout << p << "\n";
return 0;
}
ビルド実行結果
a
b
c
(空白となります)
abc
ソーラー「ポインタ変数を使って
文字列データ"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 <iostream>
using namespace std;
int main() {
char *p;
p[0] = 'a';
p[1] = 'b';
p[2] = 'c';
p[3] = '\0';
cout << p[0] << "\n";
cout << p[1] << "\n";
cout << p[2] << "\n";
cout << p[3] << "\n";
cout << p << "\n";
return 0;
}
ビルド実行結果
エラー 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]='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 <iostream>
using namespace std;
int main() {
char p[4];
p[0] = 'a';
p[1] = 'b';
p[2] = 'c';
p[3] = '\0';
cout << p[0] << "\n";
cout << p[1] << "\n";
cout << p[2] << "\n";
cout << p[3] << "\n";
cout << p << "\n";
return 0;
}
ビルド実行結果
a
b
c
(空白となっています)
abc
ソーラー「
ポインタ変数を使って
💖char* p = "abc";💖
を実行して
文字列データ"abc"をメモリに格納した場合は
💖ポインタ変数pに💖
💖文字列データ"abc"を格納している連続したメモリの先頭のメモリのアドレスが💖
💖代入されます💖
p[0]
p[1]
p[2]
p[3]
はどのメモリにアクセスしていいかわかることになります
ですので
p[0]
p[1]
p[2]
p[3]
を用いて
cout << p[0] << "\n";
cout << p[1] << "\n";
cout << p[2] << "\n";
cout << p[3] << "\n";
を実行し
メモリに格納した
文字データ
'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 <iostream>
using namespace std;
int main() {
char* p = "abc";
cout << p[0] << "\n";
cout << p[1] << "\n";
cout << p[2] << "\n";
cout << p[3] << "\n";
p[0] = 'd';
p[1] = 'e';
p[2] = 'f';
p[3] = '\0';
cout << p[0] << "\n";
cout << p[1] << "\n";
cout << p[2] << "\n";
cout << p[3] << "\n";
return 0;
}
ビルド実行結果
a
b
c
abc
(空白が表示されます)
続行するには何かキーを押して下さい . . .
アレサ「
a
b
c
abc
(空白が表示されます)
までは
直ぐに実行結果が表示されるのですが
続行するには何かキーを押して下さい . . .
が表示されるまで
大分時間がかかっています
そして
p[0] = 'd';
p[1] = 'e';
p[2] = 'f';
p[3] = '\0';
cout << p[0] << "\n";
cout << p[1] << "\n";
cout << p[2] << "\n";
cout << p[3] << "\n";
は実行されていません」
ソーラー「
char* p = "abc";
p[0]
p[1]
p[2]
p[3]
を実行して
p[0]
p[1]
p[2]
p[3]
がアクセスするメモリが定まっているのに
p[0] = 'd';
p[1] = 'e';
p[2] = 'f';
が実行できないなんて
おっかしいなあ😊
なんでこんな仕組みになっているんだろう?」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます