配列宣言を初期化される際に用いられるブロック{}内には配列変数に格納できるデータを記述することができます よって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" };
も実行することができるのですね(*´▽`*)」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます