🌞🌞複数の文字列データを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"の3つの文字列データを


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




今までのように


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


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


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



てんC「3つの配列宣言をおこない

👇

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


文字列データ


"apple"

"ringo"

"cashewnuts"


を 


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


👇


#include <iostream>


using namespace std;


int main() {


char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


cout << str << "\n";

cout << ars << "\n";

cout << arr << "\n";

return 0;


}


ビルド実行結果


apple

ringo

cashewnuts



3つのポインタ変数宣言


char* str="apple";

char* ars="ringo";

char* ars="cashewnuts";



を行い


文字列データ

"apple"

"ringo"

"cashewnuts"


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


👇


#include <iostream>


using namespace std;


int main() {


char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";


cout << str << "\n";

cout << ars << "\n";

cout << arr << "\n";

return 0;


}


ビルド実行結果


apple

ringo

cashewnuts


👆

これらのプログラムは



       1つの配列宣言



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



を使うことによって



簡略化されて


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




#include <iostream>


using namespace std;


int main() {


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


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

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

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

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]


には文字列データは格納されませんがナル文字\0が格納されることになります



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]


には文字列データは格納されませんがナル文字\0が格納されることになります


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" 👈1

"ringo" 👈2

"cashewnuts" 👈3


を格納するために


char hairetu[3][11]の


[3]は要素数が3


そして


文字列データ


cashewnuts(10文字)



\0(ナル文字)


とあわせて


11文字格納するために


char hairetu[3][11]の


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



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



てんC「このとき


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

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

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



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



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

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

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



hairetu[0]

hairetu[1]

hairetu[2]


に当たる部分には


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


hairetu[0]

hairetu[1]

hairetu[2]



配列変数で


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


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



みなさ~ん



🐅  🐕  🐓  🐜  🐂  🐇🐇  


🐏  🐪  



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




🐇  🐂  🐐  🐈  🐘  . . .



ぞろぞろ・・・


それでは 


ソーラーさん


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



ソーラー「ふつう



cout << hairetu << "\n";


            🐥hairetu🐥は




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



文字列データがメモリに格納されたとき



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



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



同時に



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





☆  ☆  ☆  ☆  ☆  ☆


👆ここの部分を


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


以前のエピソードで学んだことのおさらいになりますね


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


"apple"


のような


文字列データがメモリに格納されたとき


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]


には

文字列データ"apple"の


'a'

'p'

'p'

'l'

'e'

'\0'

が格納されることになりますが


配列変数


hairetu[0]


には


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


そして


hairetuは


配列変数


hairetu[0]


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



               solarplexussより


☆  ☆  ☆  ☆  ☆  ☆


ですので


文字列データをcout出力表示するときに


cout << hairetu << "\n";


のように


       ポインタ変数🐥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]


には文字列データは格納されませんがナル文字\0が格納されることになります


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]


には文字列データは格納されませんがナル文字\0が格納されることになります


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"



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


文字列データ

"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"


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


#include <iostream>


using namespace std;


int main() {


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


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

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

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

return 0;


}


ビルド実行結果


apple

ringo

cashewnuts



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


文字列データ


"apple"

"ringo"

"cashewnuts"


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


文字列データ

"apple"

"ringo"

"cashewnuts"

の先頭のアドレス


&hairetu[0][0]

&hairetu[1][0]

&hairetu[2][0]

をもちいて


cout出力表示されていますね。


実はこのとき


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

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

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


の代わりに


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

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

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



をもちいても


文字列データ

"apple"

"ringo"

"cashewnuts"



cout出力表示できる仕組みとなっています。


ですので


#include <iostream>


using namespace std;


int main() {


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


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

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

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

return 0;


}


のように


プログラムが記述されていたわけです。


このときの

           


            🐥hairetu[0]🐥は




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

  


            🐥hairetu[1]🐥は



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


            


            🐥hairetu[2]🐥は



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


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


つまり


配列変数


hairetu[0]

hairetu[1]

hairetu[2]



文字列データ


"apple"

"ringo"

”cashewnuts”



格納しているメモリの


アドレスを格納している


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


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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