2次元配列a[2][4]のaはchar(*)[4]型のポインタ変数でありchar**型のポインタ変数ではありません ですのでchar**型のポインタ変数bにaを代入することはできません


ソーラー「


char型の2次元配列宣言


char a[2][4];


により生成される


2次元配列a[2][4]のaは


char型の変数のアドレスを格納するポインタ変数のアドレスを格納するポインタ変数


でした


そして


char (*)[4]型のポインタ変数宣言


char (*b)[4];


により生成される


bも


char型の変数のアドレスを格納するポインタ変数のアドレスを格納するポインタ変数


でした




そして

char (*)[4]型のポインタ変数宣言


char (*b)[4];


により生成される


bには


char型の2次元配列宣言


char a[2][4];


により生成される2次元配列aのaを


代入することができます


そのプログラムはこちらです

👇


#include <stdio.h>


int main() {


char a[2][4] = { "cat","hat" };


printf("%c\n", a[0][0]);

printf("%c\n", a[0][1]);

printf("%c\n", a[0][2]);

printf("%c\n", a[0][3]);

printf("%c\n", a[1][0]);

printf("%c\n", a[1][1]);

printf("%c\n", a[1][2]);

printf("%c\n", a[1][3]);

printf("%s\n", a[0]);

printf("%s\n", a[1]);


char(*b)[4];


b = a;


printf("%c\n", b[0][0]);

printf("%c\n", b[0][1]);

printf("%c\n", b[0][2]);

printf("%c\n", b[0][3]);

printf("%c\n", b[1][0]);

printf("%c\n", b[1][1]);

printf("%c\n", b[1][2]);

printf("%c\n", b[1][3]);

printf("%s\n", b[0]);

printf("%s\n", b[1]);


return 0;


}



ビルド実行結果

c

a

t

(空白)

h

a

t

cat

hat

c

a

t

h

a

t

(空白)

cat

hat



ソーラー「このように


char (*)[4]型のポインタ変数宣言


char (*b)[4];


により生成される


bに


char型の2次元配列宣言


char a[2][4];


により生成される2次元配列aのaを


        b=a;



代入すると


2次元配列aの配列変数


a[0][0]

a[0][1]

a[0][2]

a[0][3]

a[1][0]

a[1][1]

a[1][2]

a[1][3]


と全く同じタイプの配列変数


b[0][0]

b[0][1]

b[0][2]

b[0][3]

b[1][0]

b[1][1]

b[1][2]

b[1][3]


が生成され


b[0][0]

b[0][1]

b[0][2]

b[0][3]

b[1][0]

b[1][1]

b[1][2]

b[1][3]


2次元配列aの配列変数


a[0][0]

a[0][1]

a[0][2]

a[0][3]

a[1][0]

a[1][1]

a[1][2]

a[1][3]

がアクセスしているメモリにアクセスすることになり



b[0][0]

b[0][1]

b[0][2]

b[0][3]

b[1][0]

b[1][1]

b[1][2]

b[1][3]

'c'

'a'

't'

'\0'

'h'

'a'

't'

'\0'


をあらわすことになります


2次元配列a

2次元配列bは同じメモリにアクセスしているわけですね」


アレサ「はぁ」


solarplexuss「すごいな これ


2次元配列aがアクセスしているメモリに


別の2次元配列bでアクセスできるようになるなんて」



ソーラー「このプログラムでは


💖char (*)[4]型💖のポインタ変数宣言


char (*b)[4];


により生成される


💖char (*)[4]型💖のポインタ変数


bに


char型の2次元配列宣言


char a[2][4];


により生成される2次元配列aのaを


代入することができています



つまり


char型の2次元配列宣言


char a[2][4];



a



💖char (*)[4]型💖のポインタ変数であり


char**型のポインタ変数ではありません



ですので



char** 型のポインタ変数宣言



char** b;


により生成されるポインタ変数bに


char (*)[4]型のポインタ変数である


char型の2次元配列 a[2][4]の


            a



 を


b=a;


 のように代入することはできません             



そのことを示すプログラムは次のようになります

👇


#include <stdio.h>


int main() {


char a[2][4] = { "cat","hat" };


printf("%c\n", a[0][0]);

printf("%c\n", a[0][1]);

printf("%c\n", a[0][2]);

printf("%c\n", a[0][3]);

printf("%c\n", a[1][0]);

printf("%c\n", a[1][1]);

printf("%c\n", a[1][2]);

printf("%c\n", a[1][3]);

printf("%s\n", a[0]);

printf("%s\n", a[1]);


char** b;


b = a;


printf("%c\n", b[0][0]);

printf("%c\n", b[0][1]);

printf("%c\n", b[0][2]);

printf("%c\n", b[0][3]);

printf("%c\n", b[1][0]);

printf("%c\n", b[1][1]);

printf("%c\n", b[1][2]);

printf("%c\n", b[1][3]);

printf("%s\n", b[0]);

printf("%s\n", b[1]);


return 0;


}


ビルド実行結果


エラー (アクティブ) E0513 型 "char (*)[4]" の値を型 "char **" のエンティティに割り当てることはできません

エラー C2440 '=': 'char [2][4]' から 'char **' に変換できません。


ソーラー「


ビルドエラーにも


型 "char (*)[4]" の値を型 "char **" のエンティティに割り当てることはできません



が表示されていますね」


アレサ「


char (*)[4]型のポインタ変数



char**型のポインタ変数



ともに


char型の変数のアドレスを格納するポインタ変数のアドレスを格納するポインタ変数なのですが


異なるポインタ変数というわけなのですね」


solarplexuss「なるほど


だから


char a[2][4] = { "cat","hat" };


char** b;


b = a;


を実行しても


2次元配列aの配列変数


a[0][0]

a[0][1]

a[0][2]

a[0][3]

a[1][0]

a[1][1]

a[1][2]

a[1][3]


と全く同じタイプの配列変数


b[0][0]

b[0][1]

b[0][2]

b[0][3]

b[1][0]

b[1][1]

b[1][2]

b[1][3]


のようなものは生成されず


2次元配列aの配列変数


a[0][0]

a[0][1]

a[0][2]

a[0][3]

a[1][0]

a[1][1]

a[1][2]

a[1][3]

の格納している文字データ


'c'

'a'

't'

'\0'

'h'

'a'

't'

'\0'



b[0][0]

b[0][1]

b[0][2]

b[0][3]

b[1][0]

b[1][1]

b[1][2]

b[1][3]



b[0][0]='c';

b[0][1]='a';

b[0][2]='t';

b[0][3]='\0';

b[1][0]='h';

b[1][1]='a';

b[1][2]='t';

b[1][3]='\0';


と代入されることもない


つまり


char**型のポインタ変数bに


char(*)[4]型のポインタ変数であるaを代入する


すなわち


char**型のポインタ変数bに


2次元配列a[2][4]の先頭の配列変数のアドレスを格納するポインタ変数*a


の格納しているポインタ変数aを代入する


b = a;


を実行しても          


2次元配列bが生成されて


2次元配列bが


2次元配列aのアクセスしているメモリに


アクセスするようになることはないんだね」










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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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