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]);


を実行しても何も表示されないというわけです」


アレサ「そういう仕組みだったのですね😊」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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