配列を用いて複数のポインタ変数宣言を行うことができます。配列を用いて複数のポインタ変数宣言を行うとどのようなことが可能になるのでしょうか?

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

アレサ「今回は 


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[]={"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 * 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


これらのプログラムは


            1つのポインタ変数宣言



        char *hairetu[]={"apple","ringo","cashewnuts"}


を使うことによって


簡略化されて


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


#include <stdio.h>

int main(void){


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


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

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

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


return 0;

}


コンパイル結果

apple

ringo

cashewnuts


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


とりこむ文字列データが100個だったらこの方法は有効だね(^_^)/」


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



アレサ「このとき


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[1]

hairetu[2]

・

・

・

が生成され


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

・

・

・

には

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


配列変数

hairetu[0]

には

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


そして

hairetuは

配列変数

hairetu[0]

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


                solarplexussより


☆  ☆  ☆  ☆  ☆  ☆




ですので


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


printf出力表示するときに



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

のように


       ポインタ変数🐥hairetu🐥は 


用いられます。


同様に

ポインタ変数宣言

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

が行われて


文字列データ

"apple"

"ringo"

"cashewnuts"

がメモリに格納されて


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

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

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

が実行されるときの


このときの

                


            🐥hairetu[0]🐥は


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

         

       

            🐥hairetu[1]🐥は


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

                 

            🐥hairetu[2]🐥は


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



となっているのです。


つまり


ポインタ変数宣言

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


が実行されたとき


3つのポインタ変数

hairetu[0]

hairetu[1]

hairetu[2]

が生成されています


そして


3つのポインタ変数

hairetu[0]

hairetu[1]

hairetu[2]

に

hairetu[0]="apple";

hairetu[1]="ringo";

hairetu[2]="cashewnuts";


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


(正確には


文字列データ

"apple"

"ringo"

"cashewnuts"


を格納している先頭のメモリのアドレスが格納されています)



もうちょっと別の言い方をすれば


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

は


char *hairetu[0]="apple";

char *hairetu[1]="ringo";

char *hairetu[2]="cashewnuts";


と3つのポインタ変数宣言が

行われているのに等しいのですね。


char *hairetu[0]="apple";

char *hairetu[1]="ringo";

char *hairetu[2]="cashewnuts";

が実行されると


ポインタ変数

hairetu[0]

hairetu[1]

hairetu[2]

が作製されているような形になるのですね。


______________________________________


実際にはVisual Studioでは


char *hairetu[0]="apple";


はビルドできません。


Visual Studioのコンパイラはhairetu[0]を1つのポインタ変数とみなしていません。


Visual Studioのコンパイラは


char *hairetu[0]は


ポインタ変数の配列をつくるものと受け取ってしまいます。


つまり要素数が


char *hairetu[3];のように


3なら


char *hairetu[0];

char *hairetu[1];

char *hairetu[2];


のように


ポインタ変数の配列


hairetu[0]

hairetu[1]

hairetu[2]


が作製されることになりますが


要素数が0と記述してあるので


ポインタ変数の配列が1つも作製できませんと


ビルドエラーを表示します。

______________________________________



次のプログラムのコンパイル結果をみていただければ


hairetu[0]

hairetu[1]

hairetu[2]

が

文字列データ

"apple"

"ringo"

”cashewnuts”

を


格納している先頭のメモリ


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


ポインタ変数となっていることが


おわかりになられると思います。


ついでに

ポインタ変数

hairetu[0]

hairetu[1]

hairetu[2]

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


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


#include <stdio.h>

int main(void){


char *hairetu[]={"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

00402000

00402006

0040200c


Visual Studioの場合


apple

ringo

cashewnuts

001C7CE0

001C7BD8

001C7B30


ソーラー「

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の場合

00402000

00402006

0040200c


Visual Studioの場合


001C7CE0

001C7BD8

001C7B30


となっているのことがわかるのですが


このコンパイル結果は


先の

🍓3つのポインタ変数🍓

str

ars

arr

をつかって

文字列データ"apple"

文字列データ"ringo"

文字列データ"cashewnuts"


をメモリに格納して


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

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

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

を実行したときの


コンパイル結果と一致しています。



プログラムは

以下のようでしたね。


#include <stdio.h>

int main(void){


char *str="apple";

char *ars="ringo";

char *arr="cashewnuts";


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

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

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


return 0;

}


コンパイル結果


EAZY IDECの場合

00402000

00402006

0040200c


Visual Studioの場合


001C7CE0

001C7BD8

001C7B30


それはおいておいて


ふだんは


char hairetu[]やchar* hairetuによって生成される


配列変数が


hairetu[0]

hairetu[1]

hairetu[2]


となるんだけど


今の場合のように


ポインタ変数宣言


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


が用いられたプログラムが実行された場合


3つのポインタ変数宣言




char *hairetu[0]="apple";

char *hairetu[1]="ringo";

char *hairetu[2]="cashewnuts";


が行われているような感じになります。


#include <stdio.h>

int main(void){


char *hairetu[]={"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;

}


ソーラー「ですので


char *hairetu[0]="apple";

char *hairetu[1]="ringo";

char *hairetu[2]="cashewnuts";

を参照すると

hairetu[0]

hairetu[1]

hairetu[2]

は

配列変数でなく


文字列データ

"apple"

"ringo"

"cashewnuts"


を保存している先頭のメモリのアドレスを格納している


ポインタ変数となっているんだね」


アレサ「つまり


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

では


同時に3つのポインタ変数宣言が


1つのポインタ変数宣言により実行されているのですね。」


{"apple","ringo","cashewnuts"}内の文字列データ


の数が3つなのに合わせて


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


が実行されると


ポインタ変数


hairetu[0]

hairetu[1]

hairetu[2]

が作製されているのですね。」



ソーラー「そして


3つの配列宣言

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


3つのポインタ変数宣言

char *str="apple";

char *ars="ringo";

char *arr="cashewnuts";



一番簡単に記述できる

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


において


"apple","ringo","cashewnuts"が格納されている


先頭のメモリのアドレスが


それぞれ


EAZY IDECの場合


3つの配列宣言を用いた

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";

により

"apple","ringo","cashewnuts"が格納された


先頭のメモリのアドレスが


0019FF52(文字列データ"apple"を格納している先頭のメモリのアドレス)

0019FF4C(文字列データ"ringo"を格納している先頭のメモリのアドレス)

0019FF41(文字列データ"cashewnuts"を格納している先頭のメモリのアドレス)


となっていて


3つのポインタ変数宣言を用いた

char *str="apple";

char *ars="ringo";

char *arr="cashewnuts";

により

文字列データ

"apple","ringo","cashewnuts"が格納された


先頭のメモリのアドレスが

00402000(文字列データ"apple"を格納している先頭のメモリのアドレス)

00402006(文字列データ"ringo"を格納している先頭のメモリのアドレス)

0040200C(文字列データ"cashewnuts"を格納している先頭のメモリのアドレス)


となっていて


一番簡単に記述できる

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

により

文字列データ

"apple","ringo","cashewnuts"が格納された


先頭のメモリのアドレスが

00402000(文字列データ"apple"を格納している先頭のメモリのアドレス)

00402006(文字列データ"ringo"を格納している先頭のメモリのアドレス)

0040200C(文字列データ"cashewnuts"を格納している先頭のメモリのアドレス)


となっていて


Visual Studioの場合


3つの配列宣言

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";

により

文字列データ

"apple","ringo","cashewnuts"が格納された


先頭のメモリのアドレスが

0053FE14

0053FE04

0053FEF0


となっていて


3つのポインタ変数宣言

char *str="apple";

char *ars="ringo";

char *arr="cashewnuts";

により

文字列データ

"apple","ringo","cashewnuts"が格納された


先頭のメモリのアドレスが

001C7CE0

001C7BD8

001C7B30

となっていて


一番簡単に記述できる

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

により

文字列データ

"apple","ringo","cashewnuts"が格納された


先頭のメモリのアドレスが

001C7CE0

001C7BD8

001C7B30


となっているところも


とってもお茶目さんだね。」


アレサ「ここは かわいいと思いますの


EAZY IDECの場合では


3つの配列宣言を用いた

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";

により

"apple","ringo","cashewnuts"が格納された


先頭のメモリのアドレスが


0019FF52

0019FF4C

0019FF41


となっているのがわかります


このとき


文字列データを

格納する順序が


数値の大きい

アドレス0019FF52から


数値の小さい

アドレス0019FF41となっています


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

により

文字列データ

"apple","ringo","cashewnuts"が格納された


先頭のメモリのアドレスは

00402000

00402006

0040200C

となっています


こちらでは

文字列データを

格納する順序が


数値の小さいアドレス00402000からとなっています。


そしてよくみると


00402000の次のアドレスが

00402006になっています


これは 文字列データ"apple"


をメモリに格納させる際


apple(5バイト)と


appleをコンピュータに文字列と認識させるための


ナル文字\0(1バイト)をメモリに格納したため


appleの次に格納される文字列データである


"ringo"を格納する場所のアドレスが


00402000から6バイト後の


00402006から始まっているからなのです


そして次は


文字列データ"ringo"


をメモリに格納させることになるのですが


文字列ringo(5バイト)と


文字列ringoをコンピュータに文字列と認識させるための


ナル文字\0(1バイト)をメモリに格納することになるので


ringoの次に格納される文字列データである


"cashewnuts"を格納するメモリのアドレスは


00402006から6バイト後の


0040200Cから始まっているのですね


いかがですか?」


ソーラー「わあ おぉう 


Nice フォロ~ アレサ~


いいね🌞


あはははは


おっとおっと さっきの続きだったね


3つの配列宣言

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


3つのポインタ変数宣言

char *str="apple";

char *ars="ringo";

char *arr="cashewnuts";


一番簡単に記述できる

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


とも文字列データ

"apple","ringo","cashewnuts"を格納してるね。


そして


3つのポインタ変数宣言(🌞🌞🌞🌞🌞🌞🌞🌞)

char *str="apple";

char *ars="ringo";

char *arr="cashewnuts";

を使って

文字列データ

"apple"

"ringo"

"cashewnuts"

をコンピュータのメモリに格納した場合

と


一番簡単に記述できるポインタ変数宣言(🌞🌞🌞🌞🌞🌞🌞🌞)

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


を使って

文字列データ

"apple"

"ringo"

"cashewnuts"

をコンピュータのメモリに格納した場合の


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

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

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


の


コンパイル結果が


EAZY IDECの場合


00402000

00402006

0040200C



Visual Studioの場合

001C7CE0

001C7BD8

001C7B30


と

文字列データ

"apple"

"ringo"

"cashewnuts"


を格納した先頭のメモリのアドレスが一致している


ということは


3つのポインタ変数宣言

char *str="apple";

char *ars="ringo";

char *arr="cashewnuts";


をつかって

文字列データ

"apple"

"ringo"

"cashewnuts"


をメモリに格納する場合と


一番簡単に記述できる

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


をつかって

文字列データ

"apple"

"ringo"

"cashewnuts"


をメモリに格納する場合では記述方法が違うけれども


全く同じ命令をコンピュータに与えているんじゃないかな。


ただ


3つの配列宣言

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


を使って


文字列データ

"apple"

"ringo"

"cashewnuts"


をコンピュータのメモリに格納した場合は


文字列データ

"apple"

"ringo"

"cashewnuts"を


格納したメモリのアドレスは


EAZY IDECの場合


0019FF52

0019FF4C

0019FF41


Visual Studioの場合

0053FE14

0053FE04

0053FEF0


と


ポインタ変数を使って

文字列データ

"apple","ringo","cashewnuts"を格納した場合と


異なっているね。


ポインタ変数を使って


文字列データ

"apple","ringo","cashewnuts"を格納した場合と


配列を使って文字列データ

"apple","ringo","cashewnuts"を格納する場合では


異なった命令がコンピュータに送られているんだね。」

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

作者を応援しよう!

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

応援したユーザー

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