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

ソーラー「今日は


char型の配列宣言、初期化


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


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


てんC「ブロック{}の仕組みですか?」


ソーラー「そう、


ブロック{}の仕・組・み💖」



てん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'


に混ざって


数値データ97


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


めずらしい記述ですね」


ソーラー「そうなんだよ



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


が実行されると


char型の配列変数

hairetu[0]

hairetu[1]

hairetu[2]

が生成されます


hairetu[0]

hairetu[1]

hairetu[2]

char型の配列変数なので


文字データ

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


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


ですので


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



が実行されると


char型の配列変数


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


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


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


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


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


#include <iostream>


using namespace std;


int main() {


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


cout << hairetu[0] << "\n";

cout << hairetu[1] << "\n";/*ここに注目*/

cout << hairetu[2] << "\n";

return 0;

}


ビルド実行結果


a

a

c


てんC「


cout << hairetu[1] << "\n";/*ここに注目*/


のビルド実行結果が


97ではなくa になっていますね


つまり



char型の配列変数

hairetu[1]



数値データが格納されている場合


その数値データ(アスキーコード)に対応する文字データが表示されるというわけですね


cout << hairetu[1] << "\n";/*ここに注目*/


の実行結果は


a


つまり


数値データ(アスキーコード)97に対応する文字データ


aが表示されているのですね


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


も実行できるのですね



ソーラー「そうなんだ


次は


ポインタ型の配列宣言


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


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


ソーラー「まず


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"

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


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型の変数のアドレス


もしくは


文字列データ

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



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

hairetu[0]

hairetu[1]

hairetu[2]

を初期化するために


ブロック{}内には


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


"apple"

"orange"

"lemon"


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


ということは


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


char a=1;

char b=2;


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



どう?」


てんC「ソーラーさん


変数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;

}


ビルド実行結果


0039FE2F

0039FE23

005D7B30


てんC「


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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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