配列宣言を初期化される際に用いられるブロック{}内には配列変数に格納できるデータを記述することができます よってchar hairetu[3] = {'a',1,'c' };と記述することも可能です

char型、char*型の配列宣言、初期化がおこなわれるときのブロック{}の仕組みを考察してみます


ソーラー「今日は


char型の配列宣言、初期化


char hairetu[3] = {'a','b','c' };


が実行されるときのブロック{}の仕組みを考察してみます」


アレサ「ブロック{}の仕組みですか?


あまり考えたことがありませんでしたの」


ソーラー「まず


char hairetu[3];


hairetu[0] ='a';

hairetu[1] ='b';

hairetu[2] ='c';


の仕組みからみていこうかな



char hairetu[3];


が実行されると


char型の配列変数


hairetu[0]

hairetu[1]

hairetu[2]


が生成されるので


hairetu[0] ='a';

hairetu[1] ='b';

hairetu[2] ='c';


のように


char型の配列変数


hairetu[0]

hairetu[1]

hairetu[2]

文字データ

'a'

'b'

'c'

を格納することができます


char hairetu[3];


hairetu[0] ='a';

hairetu[1] ='b';

hairetu[2] ='c';


をまとめて記述したものが


char hairetu[3] = {'a','b','c' };


というわけです


つまり


          ブロック{}内には



     💖生成される配列変数に対応したデータ💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖


をコンマで区切って記述することになります


char hairetu[3] = {'a','b','c' };


によって生成される配列変数


hairetu[0]

hairetu[1]

hairetu[2]



char型の配列変数なので


ブロック{}内には


文字データ


もしくは


-128をから127までの数値データをコンマで区切って記述することができるというわけです


今の場合


生成される3つの配列変数

hairetu[0]

hairetu[1]

hairetu[2]

を初期化するために


ブロック{}内には


コンマで区切って文字データ'a','b','c'が記述されているというわけです


ということは


次のような記述も可能になります




    char hairetu[3] = {'a',1,'c' };




どう?」


アレサ「ソーラーさん


文字データ'a','c'


に混ざって


数値データ1


がブロック{}内に記述されています


めずらしい記述ですね」


ソーラー「そうなんだよ



   char hairetu[3] = {'a',1,'c' };


が実行されると


char型の配列変数

hairetu[0]

hairetu[1]

hairetu[2]

が生成されます


hairetu[0]

hairetu[1]

hairetu[2]

char型の配列変数なので


文字データ

-128から127までの数値データ


を格納することができます


ですので


   char hairetu[3] = {'a',1,'c' };



が実行されると


char型の配列変数


hairetu[0] には文字データ'a'


hairetu[1] には数値データ1


hairetu[2] には文字データ'c'


が格納されるというわけです


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


#include <stdio.h>

int main(void) {


char hairetu[3] = { 'a',1,'c' };




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

printf("%d\n", hairetu[1]);

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

return 0;

}


ビルド実行結果


a

1

c


アレサ「


char hairetu[3] = { 'a',1,'c' };


も実行できるのですね



ソーラー「そうなんだ


次は


ポインタ型の配列宣言


char* hairetu[3] = {"apple","orange","lemon" };


が実行されるときのブロック{}の仕組みを考察してみます」



solarplexuss「ポインタ型の配列宣言?」


ソーラー「まず


char* hairetu[3];


hairetu[0] ="apple";

hairetu[1] ="orange";

hairetu[2] ="lemon";


の仕組みからみていこうかな



char* hairetu[3];


が実行されると


char*型の配列変数


hairetu[0]

hairetu[1]

hairetu[2]


が生成されるので


hairetu[0] ="apple";

hairetu[1] ="orange";

hairetu[2] ="lemon";


のように


char*型の配列変数


hairetu[0]

hairetu[1]

hairetu[2]

文字列データ

"apple"

"orange"

"lemon"

を格納することができます


(Visual studio2019以降ではchar*型のポインタ変数を使って文字列データをメモリに格納する機能は削除されていますので


char*型の配列変数


hairetu[0]

hairetu[1]

hairetu[2]

文字列データ

"apple"

"orange"

"lemon"

を格納する


hairetu[0] ="apple";

hairetu[1] ="orange";

hairetu[2] ="lemon";


を実行して


文字列データ


文字列データ

"apple"

"orange"

"lemon"


をメモリに格納することはできません



すなわち


char*型の配列変数


hairetu[0]

hairetu[1]

hairetu[2]


を使って文字列データをメモリに格納することはできません)




char* hairetu[3];


hairetu[0] ="apple";

hairetu[1] ="orange";

hairetu[2] ="lemon";


をまとめて記述したものが


char* hairetu[3] = {"apple","orange","lemon" };


というわけです


つまり


          ブロック{}内には



     💖生成される配列変数に対応したデータ💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖


をコンマで区切って記述することになります


char* hairetu[3] = {"apple","orange","lemon" };


によって生成される配列変数


hairetu[0]

hairetu[1]

hairetu[2]



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


ブロック{}内には


char型の変数のアドレス


もしくは


文字列データ

を格納している連続したメモリの先頭のメモリのアドレスを格納することができます



{"apple","orange","lemon" }内の


"apple"

"orange"

"lemon"


文字列データ


"apple"

"orange"

"lemon"



を格納している連続したメモリの先頭のメモリのアドレスを表しています


"apple"

"orange"

"lemon"

アドレスとなっています




生成されるchar*型の3つの配列変数(

ポインタ変数)

hairetu[0]

hairetu[1]

hairetu[2]

を初期化するために


ブロック{}内には


コンマで区切って文字列データ


"apple"

"orange"

"lemon"


が3つ記述されているというわけです


言い換えると


文字列データ


"apple"

"orange"

"lemon"



を格納している連続したメモリの先頭のメモリのアドレスを表す


"apple"

"orange"

"lemon"


が3つ記述されているというわけです



ということは


次のような記述も可能になります


char a=1;

char b=2;


char* hairetu[3] = {&a,&b,"orange"};



どう?」


アレサ「ソーラーさん


変数aのアドレス&a


変数bのアドレス&b


に混ざって


文字列データ"orange"


がブロック{}内に記述されています


めずらしい記述ですね」


ソーラー「そうなんだよ


char a=1;

char b=2;


char* hairetu[3] = {&a,&b,"orange" };



が実行されると


char*型の配列変数

hairetu[0]

hairetu[1]

hairetu[2]

が生成されます


hairetu[0]

hairetu[1]

hairetu[2]

char*型の配列変数なので


char型の変数のアドレス


もしくは


文字列データ

を格納しているメモリ領域の先頭のメモリのアドレスを格納することができます



char a=1;

char b=2;


char* hairetu[3] = {&a,&b,"orange" };


が実行されると


char*型の配列変数


hairetu[0] には変数aのアドレス&a


hairetu[1] には変数bのアドレス&b


hairetu[2] には"文字列データ"orange"を格納している連続したメモリ領域の先頭のメモリのアドレス


が格納されるというわけです


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


#include <stdio.h>

int main(void) {


char a=1;

char b=2;


char* hairetu[3] = {&a,&b,"orange" };



printf("%p\n", hairetu[0]);

printf("%p\n", hairetu[1]);

printf("%p\n", hairetu[2]);

return 0;

}


ビルド実行結果


001EF86F

001EF863

003C6CD0


アレサ「


hairetu[0] に格納されている変数aのアドレス&a


hairetu[1] に格納されている変数bのアドレス&b


hairetu[2] に格納されている"文字列データ"orange"を格納している連続したメモリの先頭のメモリのアドレス


が表示されていますね


char a=1;

char b=2;


char* hairetu[3] = {&a,&b,"orange" };


も実行することができるのですね(*´▽`*)」




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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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