天国にいけるC言語入門 ヘキサ構造体 ver2.2126
char*型の配列宣言char* a[3];は初期化される必要があり 初期化されないで場合 配列変数a[0][0],a[0][1]‥は配列変数として機能しません
char*型の配列宣言char* a[3];は初期化される必要があり 初期化されないで場合 配列変数a[0][0],a[0][1]‥は配列変数として機能しません
ソーラー「
ポインタ変数宣言
char *a[3];
を実行すると
3つのポインタ変数
a[0]
a[1]
a[2]
が生成されました
その時のプログラムは
こちらです
👇
#include <stdio.h>
int main() {
char *a[3] ;
a[0] = "aa";
a[1] = "bb";
a[2] = "cc";
printf("%s\n", a[0]);
printf("%s\n", a[1]);
printf("%s\n", a[2]);
printf("%c\n", a[0][0]);
printf("%c\n", a[0][1]);
printf("%c\n", a[0][2]);
printf("%c\n", a[1][0]);
printf("%c\n", a[1][1]);
printf("%c\n", a[1][2]);
printf("%c\n", a[2][0]);
printf("%c\n", a[2][1]);
printf("%c\n", a[2][2]);
return 0;
}
ビルド実行結果
aa
bb
cc
a
a
b
b
c
c
ソーラー「
char *a[3] ;
により
ポインタ変数
a[0]
a[1]
a[2]
が
生成され
a[0] = "aa";
a[1] = "bb";
a[2] = "cc";
の実行により
メモリに
文字列データ
"aa"
"bb"
"cc"
が格納されています
このとき
ポインタ変数
a[0]
a[1]
a[2]
は
文字列データ
"aa"
"bb"
"cc"
を格納しているメモリの先頭のメモリのアドレスが格納され
初期化されていますね
そして
printf("%s\n", a[0]);
printf("%s\n", a[1]);
printf("%s\n", a[2]);
の実行により
aa
bb
cc
がコマンドプロンプト画面に表示されています
このとき
ポインタ変数
a[0]
a[1]
a[2]
には
💖アドレス💖
が代入されているので
配列変数
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
a[2][0]
a[2][1]
a[2][2]
を生成することができ
文字データ
'a'
'a'
'\0'
'b'
'b'
'\0'
'c'
'c'
'\0'
が
a[0][0] = 'a';
a[0][1] = 'a';
a[0][2] = '\0';
a[1][0] = 'b';
a[1][1] ='b';
a[1][2] = '\0';
a[2][0] = 'c';
a[2][1] ='c';
a[2][2] = '\0';
と格納されています
ちょうど
char型のポインタ変数bに
アドレスが代入されると
配列変数
b[0]
b[1]
b[2]
・
・
・
を生成することができ
配列変数
b[0]
b[1]
b[2]
・
・
・
に文字データが代入できるのと仕組みは同じですね」
アレサ「そうですの ソーラーさん」
ソーラー「ところで
次のようなプログラムは実行できません
👇
#include <stdio.h>
int main() {
char *a[3] ;
a[0][0] = 'a';
a[0][1] = 'a';
a[0][2] = '\0';
a[1][0] = 'b';
a[1][1] ='b';
a[1][2] = '\0';
a[2][0] = 'c';
a[2][1] ='c';
a[2][2] = '\0';
printf("%s\n", a[0]);
printf("%s\n", a[1]);
printf("%s\n", a[2]);
printf("%c\n", a[0][0]);
printf("%c\n", a[0][1]);
printf("%c\n", a[0][2]);
printf("%c\n", a[1][0]);
printf("%c\n", a[1][1]);
printf("%c\n", a[1][2]);
printf("%c\n", a[2][0]);
printf("%c\n", a[2][1]);
printf("%c\n", a[2][2]);
return 0;
}
ビルド実行結果
何も表示されません
アレサ「なぜですの?
a[0][0] = 'a';
a[0][1] = 'a';
a[0][2] = '\0';
a[1][0] = 'b';
a[1][1] ='b';
a[1][2] = '\0';
a[2][0] = 'c';
a[2][1] ='c';
a[2][2] = '\0';
が実行されているはずなのに
printf("%s\n", a[0]);
printf("%s\n", a[1]);
printf("%s\n", a[2]);
printf("%c\n", a[0][0]);
printf("%c\n", a[0][1]);
printf("%c\n", a[0][2]);
printf("%c\n", a[1][0]);
printf("%c\n", a[1][1]);
printf("%c\n", a[1][2]);
printf("%c\n", a[2][0]);
printf("%c\n", a[2][1]);
printf("%c\n", a[2][2]);
が実行されていないみたいです・・・
ソーラー「くすっ
そ・れ・はね
char *a[3] ;
を実行すれば
ポインタ変数
a[0]
a[1]
a[2]
が生成されます
ですが
char *a[3] ;
だけでは
ポインタ変数
a[0]
a[1]
a[2]
は初期化されませんね
ポインタ変数
a[0]
a[1]
a[2]
にアドレスが代入されていないというわけです
ですから
ポインタ変数
a[0]
a[1]
a[2]
を用いて
配列変数
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
a[2][0]
a[2][1]
a[2][2]
を生成したとしても
配列変数
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
a[2][0]
a[2][1]
a[2][2]
は
どのアドレスのメモリを管理することになるか定まりませんね
ですので
a[0][0] = 'a';
a[0][1] = 'a';
a[0][2] = '\0';
a[1][0] = 'b';
a[1][1] ='b';
a[1][2] = '\0';
a[2][0] = 'c';
a[2][1] ='c';
a[2][2] = '\0';
を実行しても
どのメモリに
文字データ
'a'
'a'
'\0'
'b'
'b'
'\0'
'c'
'c'
'\0'
を格納したらいいかコンパイラは判断できないというわけです
結局
配列変数
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
a[2][0]
a[2][1]
a[2][2]
は
どのメモリを指している配列変数か定まっていないため
printf("%s\n", a[0]);
printf("%s\n", a[1]);
printf("%s\n", a[2]);
printf("%c\n", a[0][0]);
printf("%c\n", a[0][1]);
printf("%c\n", a[0][2]);
printf("%c\n", a[1][0]);
printf("%c\n", a[1][1]);
printf("%c\n", a[1][2]);
printf("%c\n", a[2][0]);
printf("%c\n", a[2][1]);
printf("%c\n", a[2][2]);
を実行しても何も表示されないというわけです」
アレサ「そういう仕組みだったのですね😊」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます