char型の変数のアドレスを格納するポインタ変数のアドレスを格納することのできるポインタ変数にはchar(*)[3]型のポインタ変数とchar **型のポインタ変数があります

char (*a)[3];はaのchar(*)[3]型のポインタ変数宣言です aには2次元配列宣言char b[😊][3];により生成される2次元配列bのアドレスを格納するbを代入することができます 

ソーラー「ふぃぃ~」


solarplexuss「ふいぃぃぃ~」


アレサ「ふぃぃぃぃ」


ソーラー「


今日は


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



            char (*a)[3];



について考察してみたいとおもいます」



solarplexuss「なになに                


        

*aが()で囲まれている


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


            char (*a)[3];


??


    ポインタ型の配列宣言        


            char *a[3];


と何が違うのかな


int型の配列宣言


            int a[3];


 が実行されると


int型の配列変数


a[0]

a[1]

a[2]


 が生成されたよね         


     ポインタ型の配列宣言        


            char *a[3];


が実行されると


char*型の配列変数


a[0]

a[1]

a[2]


が生成されることになります


a[0]

a[1]

a[2]



char*型のポインタ変数というわけです


a[0]

a[1]

a[2]



char*型のポインタ変数なので


a[0]

a[1]

a[2]


を用いて


文字列データをメモリに格納することができます


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

👇

#include <stdio.h>


int main() {


char *a[3];


a[0] = "a";

a[1] = "bb";

a[2] = "ccc";


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

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


return 0;


}


ビルド実行結果


a

bb

ccc

a

(空白)

b

b

(空白)

c

c

c

(空白)



ソーラー「


 ポインタ型の配列宣言        


            char *a[3];


を実行することにより生成される


ポインタ変数


a[0]

a[1]

a[2]


を用いて


メモリに文字列データを格納することができました



さてさて


お話は


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


            char (*a)[3];


の考察に戻ってみたいと思います


           char型の2💖次元配列宣言


char b[1][3];(🌞全部[3]がくっついているタイプの配列宣言です🌞)

char c[2][3];(🌞全部[3]がくっついているタイプの配列宣言です🌞)

char d[3][3];(🌞全部[3]がくっついているタイプの配列宣言です🌞)

char e[4][3];(🌞全部[3]がくっついているタイプの配列宣言です🌞)

char f[5][3];(🌞全部[3]がくっついているタイプの配列宣言です🌞)


が実行されると


            💖2次元配列💖


b

c

d

e

f


が生成されます


ところで

            💖2次元配列💖


b

c

d

e

f

先頭の配列変数

b[0][0]

c[0][0]

d[0][0]

e[0][0]

f[0][0]


のアドレスを格納しているポインタ変数


*b

*c

*d

*e

*f


となります


b

c

d

e

f

ではありません





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


            char (*a)[3];


が実行されると


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


が生成されます」


solarplexuss「


char(*)[3]型のポインタ変数a?


見たことのないポインタ変数だね」


ソーラー「そうなんです 初登場でっす



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



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


と同様に


変数のアドレスを格納するポインタ変数のアドレスを格納することのできるポインタ変数なんです」


solarplexuss「???」


ソーラー「つまり


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



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



ともに

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


なんですが


a=b;


b=a;


のようにお互いを代入して


持っているアドレスを代入したりすることはできません


ちょうど


char型の変数のアドレスを格納している


char*型のポインタ変数a



int型の変数のアドレスを格納している


int*型のポインタ変数a


に代入できないのと


同じ仕組みです



char(*)[3]型のポインタ変数aには


            なんと😊



char b[1][3];//🌞全部[3]がくっついているタイプの配列宣言です🌞

char c[2][3];//🌞全部[3]がくっついているタイプの配列宣言です🌞

char d[3][3];//🌞全部[3]がくっついているタイプの配列宣言です🌞

char e[4][3];//🌞全部[3]がくっついているタイプの配列宣言です🌞

char f[5][3];//🌞全部[3]がくっついているタイプの配列宣言です🌞


により生成されるタイプの



    2次元配列


b

c

d

e

f


の先頭の配列変数のアドレスを格納しているポインタ変数


*b

*c

*d

*e

*f


のアドレスを格納しているポインタ変数


b

c

d

e

f



a=b;

a=c;

a=d;

a=e;

a=f;


のように代入することができます」


solarplexuss「なんと


おお


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


って珍しいポインタ変数aだね


char b[1][3];//🌞全部[3]がくっついているタイプの2次元配列宣言です🌞

char c[2][3];//🌞全部[3]がくっついているタイプの2次元配列宣言です🌞

char d[3][3];//🌞全部[3]がくっついているタイプの2次元配列宣言です🌞

char e[4][3];//🌞全部[3]がくっついているタイプの2次元配列宣言です🌞

char f[5][3];//🌞全部[3]がくっついているタイプの2次元配列宣言です🌞


により生成されるタイプの


💖2次元配列の先頭の配列変数のアドレスを格納しているポインタ変数のアドレスを格納しているポインタ変数💖


である

b

c

d

e

f



      char(*)[3]型のポインタ変数aに


格納されるんだ😊


だったら


char b[1][4];//🌞[3]がくっついていないタイプの2次元配列宣言です🌞

char c[2][5];//🌞[3]がくっついていないタイプの2次元配列宣言です🌞

char d[3][6];//🌞[3]がくっついていないタイプの2次元配列宣言です🌞

char e[4][7];//🌞[3]がくっついていないタイプの2次元配列宣言です🌞

char f[5][8];//🌞[3]がくっついていないタイプの2次元配列宣言です🌞

により生成されるタイプの


   💖2次元配列の先頭の配列変数のアドレスを格納しているポインタ変数のアドレスを格納しているポインタ変数💖


b

c

d

e

f



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


に代入、初期化できないの?


どっかなぁ?」


アレサ「そうですね そうかもしれませんの」


ソーラー「そうなんです


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

👇


#include <stdio.h>


int main() {


char (*a)[3];


char b[1][4];//🌞[3]がくっついていないタイプの2次元配列宣言です🌞

char c[2][5];//🌞[3]がくっついていないタイプの2次元配列宣言です🌞

char d[3][6];//🌞[3]がくっついていないタイプの2次元配列宣言です🌞

char e[4][7];//🌞[3]がくっついていないタイプの2次元配列宣言です🌞

char f[5][8];//🌞[3]がくっついていないタイプの2次元配列宣言です🌞


a = b;

a = c;

a = d;

a = e;

a = f;

return 0;


}


ビルド実行結果



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

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

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

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

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

エラー C2440 '=': 'char [5][8]' から 'char (*)[3]' に変換できません。

エラー C2440 '=': 'char [4][7]' から 'char (*)[3]' に変換できません。エラー C2440 '=': 'char [3][6]' から 'char (*)[3]' に変換できません。

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

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


solarplexuss「わあ、 ほんとだ


どうなってるんだろ?」


アレサ「ほんとうですの」


ソーラー「このように


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


には


2次元配列宣言


char b[2][3];


により生成されるような


[3]がくっついている


2次元配列 b[2][3]タイプの先頭の配列変数のアドレスを格納しているポインタ変数


*b


のアドレスを格納しているポインタ変数


b


しか代入することはできません




     

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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