🌞🌞複数の文字列データを1つの配列宣言を使い同時にメモリに格納してみます その2

ソーラー「今回は 


1つの配列宣言を使って複数の文字列データをメモリに格納


してみたいとおもいます。



3つの配列宣言


char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


や


3つのポインタ変数宣言


char *str="apple";

char *ars="ringo";

char *arr="cashewnuts";


を


つかうことによって コンピュータのメモリにとりこんできた


 "apple"、"ringo"、"cashewnuts"の文字列データを



        🌞 一つの配列宣言 🌞


     🌞char hairetu[3][11]={"apple","ringo","cashewnuts"};🌞


を行うことにより


まとめてメモリにとりこむことができます



すごいな~ アレサ


char hairetu[3][11]={"apple","ringo","cashewnuts"};


このような配列の記述を行うことにより


"apple"、"ringo"、"cashewnuts"の文字列データを


1度にメモリに格納することができるんだよ。


今までのように


"apple"、"ringo"、"cashewnuts"のような


異なる3つの文字列データをコンピュータのメモリにとりこむとき


配列宣言もしくはポインタ変数宣言を3つおこなわなくてもいいんだ」



アレサ「3つの配列宣言をおこない



char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";



文字列データ


"apple"

"ringo"

"cashewnuts"


を 


コンピュータのメモリに取り込んだ次のプログラム


👇


#include <stdio.h>


int main(void){


char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


printf("%s\n",str);

printf("%s\n",ars);

printf("%s\n",arr);


return 0;

}


コンパイル結果


apple

ringo

cashewnuts


や


3つのポインタ変数宣言


char * str="apple";

char * ars="ringo";

char * ars="cashewnuts";


を行い


文字列データ

"apple"

"ringo"

"cashewnuts"


を


コンピュータのメモリに取り込んだ次のプログラム


👇

include <stdio.h>

int main(void){


char *str="apple";

char *ars="ringo";

char *arr="cashewnuts";


printf("%s\n",str);

printf("%s\n",ars);

printf("%s\n",arr);


return 0;


}


コンパイル結果


apple

ringo

cashewnuts


これらのプログラムは



       1つの配列宣言



  char hairetu[3][11]={"apple","ringo","cashewnuts"};



を使うことによって


簡略化されて


次のようにかきかえられます。


#include <stdio.h>


int main(void){


char hairetu[3][11]={"apple","ringo","cashewnuts"};



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

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

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


return 0;


}



コンパイル結果


apple

ringo

cashewnuts


ソーラー「わおっ だいぶ すっきりしたね。


いったい


char hairetu[3][11]={"apple","ringo","cashewnuts"};


が実行されると


何がおこなわれているのか


ということだね。


まず


char hairetu[3][11]の部分からかな


char hairetu[3][11]は2次元配列となっていて


char hairetu[3][11];


が実行されると


配列変数

hairetu[0][0]

hairetu[0][1]

hairetu[0][2]

hairetu[0][3]

hairetu[0][4]

hairetu[0][5]

hairetu[0][6]

hairetu[0][7]

hairetu[0][8]

hairetu[0][9]

hairetu[0][10]

hairetu[1][0]

hairetu[1][1]

hairetu[1][2]

hairetu[1][3]

hairetu[1][4]

hairetu[1][5]

hairetu[1][6]

hairetu[1][7]

hairetu[1][8]

hairetu[1][9]

hairetu[1][10]

hairetu[2][0]

hairetu[2][1]

hairetu[2][2]

hairetu[2][3]

hairetu[2][4]

hairetu[2][5]

hairetu[2][6]

hairetu[2][7]

hairetu[2][8]

hairetu[2][9]

hairetu[2][10]

が生成されます


そして


char hairetu[3][11]={"apple","ringo","cashewnuts"};


が実行されると


配列変数

hairetu[0][0]

hairetu[0][1]

hairetu[0][2]

hairetu[0][3]

hairetu[0][4]

hairetu[0][5]

hairetu[0][6]

hairetu[0][7]

hairetu[0][8]

hairetu[0][9]

hairetu[0][10]

hairetu[1][0]

hairetu[1][1]

hairetu[1][2]

hairetu[1][3]

hairetu[1][4]

hairetu[1][5]

hairetu[1][6]

hairetu[1][7]

hairetu[1][8]

hairetu[1][9]

hairetu[1][10]

hairetu[2][0]

hairetu[2][1]

hairetu[2][2]

hairetu[2][3]

hairetu[2][4]

hairetu[2][5]

hairetu[2][6]

hairetu[2][7]

hairetu[2][8]

hairetu[2][9]

hairetu[2][10]


に


文字列データ「

"apple"

"ringo"

"cashewnuts"


が


hairetu[0][0]='a';

hairetu[0][1]='p';

hairetu[0][2]='p';

hairetu[0][3]='l';

hairetu[0][4]='e';

hairetu[0][5]='\0';


hairetu[0][6]

hairetu[0][7]

hairetu[0][8]

hairetu[0][9]

hairetu[0][10]

には文字列データは格納されません。


hairetu[1][0]='r';

hairetu[1][1]='i';

hairetu[1][2]='n';

hairetu[1][3]='g';

hairetu[1][4]='o';

hairetu[1][5]='\0';


hairetu[1][6]

hairetu[1][7]

hairetu[1][8]

hairetu[1][9]

hairetu[1][10]

には文字列データは格納されません。


hairetu[2][0]='c';

hairetu[2][1]='a';

hairetu[2][2]='s';

hairetu[2][3]='h';

hairetu[2][4]='e';

hairetu[2][5]='w';

hairetu[2][6]='n';

hairetu[2][7]='u';

hairetu[2][8]='t';

hairetu[2][9]='s';

hairetu[2][10]='\0';


と文字列データが格納されます


つまり


3つの文字列データ

"apple"

"ringo"

"cashewnuts"


を格納するために


char hairetu[3][11]の


[3]は要素数が3


そして


文字列データ


cashewnuts(10文字)

を

\0(ナル文字)

とあわせて

11文字格納するために


char hairetu[3][11]の


[11]は要素数が11となっているんだよ。」



ソーラー「さ~て ここで質問で~す」



アレサ「このとき


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

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

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



なにか表記法が おかしいと思われませんか


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

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

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


の


hairetu[0]

hairetu[1]

hairetu[2]


に当たる部分には


ポインタ変数が代入されなければなりません。




hairetu[0]

hairetu[1]

hairetu[2]


は


配列変数で


ポインタ変数に見えないような気がしますが


ポインタ変数となっています。」



みなさ~ん



🐥 🐧 🐦  🐈  🐤  . . .




今日はどんなお話がでてくるのかな😊




🐥 🐧 🐦  🐈  🐤  . . .




ぞろぞろ・・・




それでは 


ソーラーさん


続きをおねがいします。」



ソーラー「ふつう



printf("%s\n",hairetu);の




            🐥hairetu🐥は




配列hairetuやポインタ変数hairetuをつかって



文字列データが格納されたとき



その文字列データが格納されているメモリの先頭のアドレスを



格納しているポインタ変数ですね。



同時に



文字列データを格納しているメモリを代表するアドレスでもありました。



☆  ☆  ☆  ☆  ☆  ☆



ちょっとだけ補足しま~す




配列hairetuやポインタ変数hairetuをつかって



文字列データが格納されたとき



配列変数

hairetu[0]

hairetu[0]

hairetu[0]

・

・

・

が生成され


配列変数

hairetu[0]

hairetu[0]

hairetu[0]

・

・

・

には


文字列データが格納されていきますが


配列変数

hairetu[0]

には

文字列データの先頭の文字データが格納されています


そして

hairetuは

配列変数

hairetu[0]

のアドレスとなっています



               solarplexussより

☆  ☆  ☆  ☆  ☆  ☆


ですので


文字列データを%s出力変換指定子をもちいて


printf出力表示するときに



printf("%s\n",hairetu);


のように


       ポインタ変数🐥hairetu🐥は 


用いられます。



ここで


char hairetu[3][11]={"apple","ringo","cashewnuts"};


が行われて


文字列データ

"apple"

"ringo"

"cashewnuts"

が


配列変数

hairetu[0][0]

hairetu[0][1]

hairetu[0][2]

hairetu[0][3]

hairetu[0][4]

hairetu[0][5]

hairetu[0][6]

hairetu[0][7]

hairetu[0][8]

hairetu[0][9]

hairetu[0][10]

hairetu[1][0]

hairetu[1][1]

hairetu[1][2]

hairetu[1][3]

hairetu[1][4]

hairetu[1][5]

hairetu[1][6]

hairetu[1][7]

hairetu[1][8]

hairetu[1][9]

hairetu[1][10]

hairetu[2][0]

hairetu[2][1]

hairetu[2][2]

hairetu[2][3]

hairetu[2][4]

hairetu[2][5]

hairetu[2][6]

hairetu[2][7]

hairetu[2][8]

hairetu[2][9]

hairetu[2][10]


に


hairetu[0][0]='a';

hairetu[0][1]='p';

hairetu[0][2]='p';

hairetu[0][3]='l';

hairetu[0][4]='e';

hairetu[0][5]='\0';


hairetu[0][6]

hairetu[0][7]

hairetu[0][8]

hairetu[0][9]

hairetu[0][10]

には文字列データは格納されません。


hairetu[1][0]='r';

hairetu[1][1]='i';

hairetu[1][2]='n';

hairetu[1][3]='g';

hairetu[1][4]='o';

hairetu[1][5]='\0';


hairetu[1][6]

hairetu[1][7]

hairetu[1][8]

hairetu[1][9]

hairetu[1][10]

には文字列データは格納されません。


hairetu[2][0]='c';

hairetu[2][1]='a';

hairetu[2][2]='s';

hairetu[2][3]='h';

hairetu[2][4]='e';

hairetu[2][5]='w';

hairetu[2][6]='n';

hairetu[2][7]='u';

hairetu[2][8]='t';

hairetu[2][9]='s';

hairetu[2][10]='\0';


と文字列データが格納されたなら


どのように


文字列データ

"apple"

"ringo"

"cashewnuts"

を

printf出力表示したらよいかということですね。


文字列データ

"apple"

"ringo"

"cashewnuts"


を格納している先頭の配列変数は


それぞれ

hairetu[0][0]

hairetu[1][0]

hairetu[2][0]

となっています


ですので

文字列データ


"apple"

"ringo"

"cashewnuts"


を表示するのに


hairetu[0][0]

hairetu[1][0]

hairetu[2][0]


のアドレス


&hairetu[0][0]

&hairetu[1][0]

&hairetu[2][0]


を用いて


次のようなプログラムを構成すれば


もしかしたら


文字列データ

"apple"

"ringo"

"cashewnuts"


がprintf出力表示できるようなきがします。


include <stdio.h>


int main(void) {


char hairetu[3][11] = { "apple","ringo","cashewnuts" };



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

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

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


return 0;


}



コンパイル結果


何も表示されません



ソーラー「???


なんか おかしいな・・・


まちがえました。



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

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

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


ではなく



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

printf("%s\n",& hairetu[1][0]);

printf("%s\n",& hairetu[2][0]);


でした。


プログラムを書き直してビルド実行してみると


#include <stdio.h>


int main(void) {


char hairetu[3][11] = { "apple","ringo","cashewnuts" };



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

printf("%s\n",&hairetu[1][0]);

printf("%s\n",&hairetu[2][0]);


return 0;


}


ビルド実行結果

apple

ringo

cashewnuts



ソーラー「このプログラムを実行して


文字列データ

"apple"

"ringo"

"cashewnuts"

が

printf出力表示できています。



実は


文字列データ

"apple"

"ringo"

"cashewnuts"


をprintf出力表示するときは


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

printf("%s\n",&hairetu[1][0]);

printf("%s\n",&hairetu[2][0]);


でなく


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

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

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


と記述するという仕組みになっています。



ですので


文字列データ

"apple"

"ringo"

"cashewnuts"


をprintf出力表示するときは



#include <stdio.h>


int main(void) {


char hairetu[3][11] = { "apple","ringo","cashewnuts" };



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

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

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


return 0;


}


のように


プログラムを記述します



このときの

               




            🐥hairetu[0]🐥は




文字列データ"apple"を格納しているメモリの先頭のアドレスを格納したポインタ変数


         


       


            🐥hairetu[1]🐥は




文字列データ"ringo"を格納しているメモリの先頭のアドレスを格納したポインタ変数


                 


            🐥hairetu[2]🐥は




文字列データ"cashewnuts"を格納しているメモリの先頭のアドレスを格納したポインタ変数


の役割をはたしています。



つまり

配列変数

hairetu[0]

hairetu[1]

hairetu[2]


は


文字列データ


"apple"

"ringo"

”cashewnuts”


を


格納しているメモリの


先頭のアドレスを格納している


ポインタ変数となっているのですね。


ついでに

配列変数

hairetu[0]

hairetu[1]

hairetu[2]


が格納しているアドレスも


次のプログラムで表示してみたいと思います。



#include <stdio.h>


int main(void){



char hairetu[3][11] = { "apple","ringo","cashewnuts" };



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

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

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


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

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

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


return 0;

}



コンパイル結果


EAZY IDECの場合


apple

ringo

cashewnuts

0019FF37

0019FF42

0019FF4D


Visual Studioの場合


apple

ringo

cashewnuts

003FF8C8

003FF8D3

003FF8DE





ソーラー「


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

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

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


が実行されることにより


文字列

apple

ringo

cashewnuts


が

コマンドプロンプト画面に表示されましたね。


つまり

hairetu[0]

hairetu[1]

hairetu[2]


は


文字列データ


"apple"

"ringo"

”cashewnuts”


を


格納しているメモリの


アドレスを格納している


ポインタ変数となっていることがわかりますね。



ポインタ変数

hairetu[0]

hairetu[1]

hairetu[2]


の格納しているアドレスが

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

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

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


が行われることにより


EAZY IDECの場合


0019FF37

0019FF42

0019FF4D


Visual Studioの場合


003FF8C8

003FF8D3

003FF8DE

となっています


つまり


char hairetu[3][11]={"apple","ringo","cashewnuts"};


が行われて



配列変数

hairetu[0][0]

hairetu[0][1]

hairetu[0][2]

hairetu[0][3]

hairetu[0][4]

hairetu[0][5]

hairetu[0][6]

hairetu[0][7]

hairetu[0][8]

hairetu[0][9]

hairetu[0][10]

hairetu[1][0]

hairetu[1][1]

hairetu[1][2]

hairetu[1][3]

hairetu[1][4]

hairetu[1][5]

hairetu[1][6]

hairetu[1][7]

hairetu[1][8]

hairetu[1][9]

hairetu[1][10]

hairetu[2][0]

hairetu[2][1]

hairetu[2][2]

hairetu[2][3]

hairetu[2][4]

hairetu[2][5]

hairetu[2][6]

hairetu[2][7]

hairetu[2][8]

hairetu[2][9]

hairetu[2][10]


が作製されているのですが


Visual Studioの場合なら


配列変数

hairetu[0][0]

hairetu[0][1]

hairetu[0][2]

hairetu[0][3]

hairetu[0][4]

hairetu[0][5]

hairetu[0][6]

hairetu[0][7]

hairetu[0][8]

hairetu[0][9]

hairetu[0][10]

hairetu[1][0]

hairetu[1][1]

hairetu[1][2]

hairetu[1][3]

hairetu[1][4]

hairetu[1][5]

hairetu[1][6]

hairetu[1][7]

hairetu[1][8]

hairetu[1][9]

hairetu[1][10]

hairetu[2][0]

hairetu[2][1]

hairetu[2][2]

hairetu[2][3]

hairetu[2][4]

hairetu[2][5]

hairetu[2][6]

hairetu[2][7]

hairetu[2][8]

hairetu[2][9]

hairetu[2][10]

のアドレスは


配列変数

hairetu[0][0]なら003FF8C8 👈hairetu[0]のアドレスですね

hairetu[0][1]なら003FF8C9

hairetu[0][2]なら003FF8CA

hairetu[0][3]なら003FF8CB

hairetu[0][4]なら003FF8CC

hairetu[0][5]なら003FF8CD

hairetu[0][6]なら003FF8CE

hairetu[0][7]なら003FF8CF

hairetu[0][8]なら003FF8D0

hairetu[0][9]なら003FF8D1

hairetu[0][10]なら003FF8D2

hairetu[1][0]なら003FF8D3 👈hairetu[1]のアドレスですね

hairetu[1][1]なら003FF8D4

hairetu[1][2]なら003FF8D5

hairetu[1][3]なら003FF8D6

hairetu[1][4]なら003FF8D7

hairetu[1][5]なら003FF8D8

hairetu[1][6]なら003FF8D9

hairetu[1][7]なら003FF8DA

hairetu[1][8]なら003FF8DB

hairetu[1][9]なら003FF8DC

hairetu[1][10]なら003FF8DD

hairetu[2][0]なら003FF8DE👈hairetu[2]のアドレスですね

hairetu[2][1]なら003FF8DF

hairetu[2][2]なら003FF8E0

hairetu[2][3]なら003FF8E1

hairetu[2][4]なら003FF8E2

hairetu[2][5]なら003FF8E3

hairetu[2][6]なら003FF8E4

hairetu[2][7]なら003FF8E5

hairetu[2][8]なら003FF8E6

hairetu[2][9]なら003FF8E7

hairetu[2][10]なら003FF8E8


となっているわけです。


ところで


char hairetu[11];


によって作製される配列変数は

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]

hairetu[9]

hairetu[10]

でした。


このときの


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


hairetuでした。


このポインタ変数hairetuを


printf("%s\n", hairetu);


のように用いることで


配列hairetuに格納されている文字列を


printf出力表示することができました。


次に


char hairetu[3][11]={"apple","ringo","cashewnuts"};


によって作製される配列変数


hairetu[0][0]

hairetu[0][1]

hairetu[0][2]

hairetu[0][3]

hairetu[0][4]

hairetu[0][5]

hairetu[0][6]

hairetu[0][7]

hairetu[0][8]

hairetu[0][9]

hairetu[0][10]

hairetu[1][0]

hairetu[1][1]

hairetu[1][2]

hairetu[1][3]

hairetu[1][4]

hairetu[1][5]

hairetu[1][6]

hairetu[1][7]

hairetu[1][8]

hairetu[1][9]

hairetu[1][10]

hairetu[2][0]

hairetu[2][1]

hairetu[2][2]

hairetu[2][3]

hairetu[2][4]

hairetu[2][5]

hairetu[2][6]

hairetu[2][7]

hairetu[2][8]

hairetu[2][9]

hairetu[2][10]


をよく観察してみると


その中の配列変数

hairetu[0][0]

hairetu[0][1]

hairetu[0][2]

hairetu[0][3]

hairetu[0][4]

hairetu[0][5]

hairetu[0][6]

hairetu[0][7]

hairetu[0][8]

hairetu[0][9]

hairetu[0][10]


の


先頭のメモリのアドレスを格納しているポインタ変数は


hairetu[0]でした。


このポインタ変数hairetu[0]を


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


のように用いることで


配列hairetuに格納されている文字列を


printf出力表示することができましたね。



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


hairetuだったように


まるで


hairetu[0]という名前の配列


配列hairetu[0]のアドレスを格納しているポインタ変数が


hairetu[0]となっているみたいだね。」








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

作者を応援しよう!

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

応援したユーザー

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