天国にいけるC言語入門 ヘキサ構造体 ver2.2126
2次元配列a[2][4]のaはchar(*)[4]型のポインタ変数でありchar**型のポインタ変数ではありません ですのでchar**型のポインタ変数bにaを代入することはできません
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のアクセスしているメモリに
アクセスするようになることはないんだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます