メモリに最後に格納された文字列データが配列変数に格納されるので配列変数に格納される文字列データは変化していきます。メモリに文字列データが格納されることと配列変数に文字列データが格納されることは別々の話

文字列データを格納するchar hairetu[ ]="nekoneko";とchar *hairetu="nekoneko";の構造を文字列データが格納される場所のアドレスを求めて比較してみます


アレサ「それでは、


配列hairetuに文字列データ"nekoneko"を格納する場合と


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


文字列データ"nekoneko"を格納する場合


の構造の違いを


もうすこし詳しくしらべてみます。ね。


まずは


配列hairetuに文字列データ"nekoneko"を格納する場合と


ポインタ変数 をつかって文字列データ"nekoneko"を格納する場合では


どこのアドレスのメモリに


文字列データ"nekoneko"が格納されているか


それぞれ調べてみましょう。


まず最初に


配列hairetuに文字列データ"nekoneko"が格納される場合ですが


char hairetu[ ]="nekoneko";


が実行されると


配列hairetu内には次の9つの配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]


が生成され


hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';

hairetu[4]='n';

hairetu[5]='e';

hairetu[6]='k';

hairetu[7]='o';

hairetu[8]='\0';


と文字データが1文字ずつ配列変数に格納されます。


すべての配列変数のアドレスを1つずつ調べてみると


#include <stdio.h>

int main(void){


char hairetu[]="nekoneko";

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

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

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

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

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

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

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

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

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

return 0;

}


でてきました。(^_^)/


コンパイル結果


EAZY IDECの場合

0019FF4F

0019FF50 (16進数では4Fの次の数値は50です)

0019FF51

0019FF52

0019FF53

0019FF54

0019FF55

0019FF56

0019FF57


Visual Studioの場合

0053FE6C

0053FE6D

0053FE6E

0053FE6F

0053FE70

0053FE71

0053FE72

0053FE73

0053FE74

となっていますね。


次は


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


文字列データ"nekoneko"がメモリに格納される場合です。


char *hairetu="nekoneko";


が実行されると


この場合も


先程と同様に


配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]

が生成され



hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';

hairetu[4]='n';

hairetu[5]='e';

hairetu[6]='k';

hairetu[7]='o';

hairetu[8]='\0';


と文字データが1文字ずつ配列変数に格納されます。


先程と同様に配列変数のアドレスを1つずつ調べてみると


#include <stdio.h>

int main(void){


char *hairetu="nekoneko";

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

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

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

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

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

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

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

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

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

return 0;

}


でてきました。😊


コンパイル結果


EAZY IDECの場合

00402000

00402001

00402002

00402003

00402004

00402005

00402006

00402007

00402008


Visual Studioの場合


00A47CE0

00A47CE1

00A47CE2

00A47CE3

00A47CE4

00A47CE5

00A47CE6

00A47CE7

00A47CE8



このコンパイル結果からも


配列hairetuを使ってメモリに文字列データ"nekoneko"を格納する場合と


ポインタ変数hairetuを使って


メモリに文字列データ"nekoneko"を格納する場合では


文字列データが格納される場所のアドレスが違うことがわかります。


ここで


いまさらですが


配列hairetuに文字列データ"nekoneko"を格納する場合でも


ポインタ変数を使って文字列データ"nekoneko"を格納する場合でも


≪ 配列名やポインタ変数名が同じ名前のhairetuなら ≫


かならず以下のような同じ名前の配列変数が生成されます


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]


そしてこれらの配列変数に


文字列データ"nekoneko"が

格納されているのです。」


ソーラー「


えっ???


ということは


同時に


≪ 配列名やポインタ変数名が同一のものを≫


たくさん配列宣言した


char hairetu[]="nekoneko";

char hairetu[]="wonwon";

char hairetu[]="tyunntyunn";



さらにマニアックに


ポインタ変数をつかって文字列データを取り込むタイプのものを混ぜて


次のように


char hairetu[]="nekoneko";

char hairetu[]="wonwon";

char hairetu[]="tyunntyunn";

char *hairetu="ru,tu,ru~";

char *hairetu="lalala";

char *hairetu="pikori~nn";


プログラムを記述してしまうと


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]


な~んかもう、(*´▽`*)


めちゃめちゃ、!(^^)!


もう(*´▽`*)


あれもこれもつめこんで😊


もう、むちゃむちゃ(*'▽')


もう、なにもかも(*^▽^*)


これはもう、\(^o^)/


こんがらがっちゃって(#^.^#)


どうしたらいいのか(*^^)v


という感じ~~~~~😊😊😊に


文字列データが格納されてしまうのでは???・・・」


アレサ「???・・・・・・・・・・とおもわれるかもしれません。


が そのようなことはおこりません。


まず第一にVisual Studioではそのような事態がおこらないよう


hairetuという名前で

変数宣言

あるいは

配列宣言

あるいは

ポインタ変数宣言を

おこなった場合


hairetuという名前を使って

新たに

変数宣言

配列宣言

ポインタ変数宣言

おこなうことはできません。


ですので


char hairetu[]="nekoneko";

char hairetu[]="wonwon";

2回同じ配列名で配列宣言を行って


プログラムを記述しても


int hairetu=5;

char hairetu[]="tyunntyunn";

char *hairetu="ru,tu,ru~";


のように


同じhairetuという名前を使って

配列宣言

ポインタ変数宣言を行って


プログラムを記述しても

ビルドエラーが生じてしまいます。


EAZY IDECの場合では


hairetuという名前で

変数宣言

あるいは

配列宣言

あるいは

ポインタ変数宣言を

おこなった場合でも


hairetuという名前を使って

新たに

変数宣言

配列宣言

ポインタ変数宣言

おこなうことができます。


プログラムの中で

char hairetu[]="nekoneko";

char hairetu[]="wonwon";

char hairetu[]="tyunntyunn";

char *hairetu="ru,tu,ru~";

char *hairetu="lalala";

char *hairetu="pikori~nn";

のように

記述されても


コンパイルエラーが起こることはありません。


Visual Studioではできませんが


EAZY IDEC の場合


char hairetu[]="nekoneko";

char hairetu[]="wonwon";

char hairetu[]="tyunntyunn";

char *hairetu="ru,tu,ru~";

char *hairetu="lalala";

char *hairetu="pikori~nn";

のように


同じ名前を使って配列宣言やポインタ変数宣言が


行われた場合は



ポインタ変数宣言


char *hairetu="ru,tu,ru~";

char *hairetu="lalala";

char *hairetu="pikori~nn";

によって

格納された文字列データ

"ru,tu,ru~"

"lalala"

"pikori~nn"



配列宣言

char hairetu[]="nekoneko";

char hairetu[]="wonwon";

char hairetu[]="tyunntyunn";


によって配列に格納された文字列データ

"nekoneko"

"wonwon"

"tyunntyunn"

すべて

コンピュータのメモリに保存されたままとなります。


つまり

同じ配列名hairetuの配列宣言によって複数の文字列データを格納する場合も



同じポインタ変数名hairetuのポインタ変数宣言によって

複数の文字列が格納された場合も


すべての

文字列データが上書きされることなくメモリに格納されます。


そして格納された文字列データを


printf出力表示することになるのですが


    配列を使って文字列データを格納した場合も🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

    ポインタ変数を使って文字列データを格納した場合も🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓



            ともに🍓🍓🍓


   最後に文字列データを格納したメモリのアドレスが


ポインタ変数hairetu🍓🍓🍓🍓🍓🍓🍓に格納されることになります。


char hairetu[]="nekoneko";

char hairetu[]="wonwon";

char hairetu[]="tyunntyunn";

char *hairetu="ru,tu,ru~";

char *hairetu="lalala";

char *hairetu="pikori~nn";

が実行されると


一番最後のポインタ変数宣言


char *hairetu="pikori~nn";


によってメモリに格納された


文字列データ"pikori~nn"


を格納しているメモリのアドレスが


ポインタ変数hairetuに格納されることになるので


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


が実行されると


pikori~nn


がコマンドプロンプト画面に表示されます。


そして


このとき


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]

には

文字列データ"pikori~nn"が

hairetu[0]='p'

hairetu[1]='i'

hairetu[2]='k'

hairetu[3]='o'

hairetu[4]='r'

hairetu[5]='i'

hairetu[6]='~'

hairetu[7]='n'

hairetu[8]='n'

hairetu[9]='\0'

と格納されています。


ですので


hairetu[0]に格納されている文字データ'p'を


コマンドプロンプト画面に表示したい場合は


%c出力変換指定子をもちい


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



実行すればよいことになります


ここでのポイントは


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


を実行すると


一番最後のポインタ変数宣言


char *hairetu="pikori~nn";


によって格納された


文字列データ"pikori~nn"の先頭の文字


hairetu[0]='p'のpがpintf出力表示されることにあるのですの。



          もし


次のように

プログラムの中で

ポインタ変数宣言

配列宣言

char *hairetu="ru,tu,ru~";

char *hairetu="lalala";

char *hairetu="pikori~nn";

char hairetu[]="nekoneko";

char hairetu[]="wonwon";

char hairetu[]="tyunntyunn";


が行われたならば


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

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


コンパイル結果はどうなるとおもわれますか?



つまり


         もし


先程のように

プログラムの中で

1番最後に


char *hairetu="pikori~nn";

hairetuのポインタ変数宣言、初期化が行われるのでなく


配列宣言、初期化の命令文である


char hairetu[]="tyunntyunn";


行われた場合は


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

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


のコンパイル結果はどうなるとおもわれますか?


この場合も


ポインタ変数宣言


char *hairetu="ru,tu,ru~";

char *hairetu="lalala";

char *hairetu="pikori~nn";

によって

格納された文字列データ

ru,tu,ru~

lalala

pikori~nn


はコンピュータのメモリに保存されたままとなりますが


配列宣言

char hairetu[]="nekoneko";

char hairetu[]="wonwon";

char hairetu[]="tyunntyunn";


によってメモリに格納された文字列データも

すべて

メモリに保存された状態となります。


そして


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


が実行されると


この場合は


一番最後の配列宣言


char hairetu[]="tyunntyunn";


によって格納された


文字列データ"tyunntyunn"


がコマンドプロンプト画面に表示されます。



このとき


文字列データ"tyunntyunn"は


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]

hairetu[9]

hairetu[10]



hairetu[0]='t'

hairetu[1]='y'

hairetu[2]='u'

hairetu[3]='n'

hairetu[4]='n'

hairetu[5]='t'

hairetu[6]='y'

hairetu[7]='u'

hairetu[8]='n'

hairetu[9]='n'

hairetu[10]='\0'


と格納されています。


hairetu[0]に格納されている文字データを


コマンドプロンプト画面に表示したいときは


%c出力変換指定子をもちい


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



実行しますね。


そして


ここでも


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


を実行すると


一番最後の配列宣言


char hairetu[]="tyunntyunn";

によって格納された


文字列データ"tyunntyunn"の先頭の文字


tが


コマンドプロンプト画面に表示されるのですの。



最後に文字列データ"tyunntyunn"を格納したメモリのアドレスが


ポインタ変数hairetuに格納されることになるので


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


が実行されると


tyunntyunn


がコマンドプロンプト画面に表示されます。


char *hairetu="ru,tu,ru~";

char *hairetu="lalala";

char *hairetu="pikori~nn";

char hairetu[]="nekoneko";

char hairetu[]="wonwon";

char hairetu[]="tyunntyunn";


の順序でなく


char *hairetu="ru,tu,ru~";

char *hairetu="lalala";

char *hairetu="pikori~nn";

char hairetu[]="nekoneko";

char hairetu[]="tyunntyunn";

char hairetu[]="wonwon";

の順序で

プログラムが記述されていたなら


5番目の命令文である

char hairetu[]="tyunntyunn";

が実行されると

文字列データ"tyunntyunn"は

配列変数に

hairetu[0]='t'

hairetu[1]='y'

hairetu[2]='u'

hairetu[3]='n'

hairetu[4]='n'

hairetu[5]='t'

hairetu[6]='y'

hairetu[7]='u'

hairetu[8]='n'

hairetu[9]='n'

hairetu[10]='\0'

と格納されるので


6番目の命令文


char hairetu[]="wonwon";

が実行されて



hairetu[0]='w'

hairetu[1]='o'

hairetu[2]='n'

hairetu[3]='w'

hairetu[4]='o'

hairetu[5]='n'

hairetu[6]='\0'

のように

文字列データ"wonwon"が


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

格納されると


hairetu[0]='t'

hairetu[1]='y'

hairetu[2]='u'

hairetu[3]='n'

hairetu[4]='n'

hairetu[5]='t'

hairetu[6]='y'

hairetu[7]='u'

hairetu[8]='n'

hairetu[9]='n'

hairetu[10]='\0'


の上に


hairetu[0]='w'

hairetu[1]='o'

hairetu[2]='n'

hairetu[3]='w'

hairetu[4]='o'

hairetu[5]='n'

hairetu[6]='\0'

hairetu[7]='u'

hairetu[8]='n'

hairetu[9]='n'

hairetu[10]='\0'


のように上書きして格納されるので


配列変数

hairetu[7]

hairetu[8]

hairetu[9]

hairetu[10]

には


hairetu[7]='u'

hairetu[8]='n'

hairetu[9]='n'

hairetu[10]='\0'


のように

文字列データ

"tyunntyunn"

のデータが1部だけ


メモリに

格納されたままになるのでは



おもわれるかもしれませんが


そのようなことにはなりません。


文字列データ

"tyunntyunn"


文字列データ"wonwon"


ともに


別々のメモリに保存されています」



ソーラー「


文字列データ

"tyunntyunn"


文字列データ"wonwon"


ともに


別々のメモリに保存されていて



配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

に格納されているデータはかわっている・・・か・・・」




配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

🐹



ソーラー「配列変数か・・・」


hairetu[0]をなにげなくみつめる。



         「よっこらせ」



ソーラー「ん??」


'w'↝hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]



ソーラー「んん??」


'w'↝↝↝ ↝ ↝  ↝  ↝    ↝🍹hairetu[0]🍙

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]




hairetu[0]「はわ~あぁ いい天気だなぁ


ここらへんでいいかな」


ソーラー「ええ??」



hairetu[0]「このおむすび🍙と🍹 うまいなあ」



🌞🌞🌞 🌞🌞🌞 🌞🌞🌞


ソーラー「!!!アレサ


天国にいけるC言語入門技だ!!!」


🌞🌞🌞 🌞🌞🌞 🌞🌞🌞


アレサ「??!!認証しました!!」


🌞🌞🌞 🌞🌞🌞 🌞🌞🌞 🌞🌞🌞 🌞🌞🌞 🌞🌞🌞


ソーラー「


大地に住まう精霊よ


天空に漂う精霊よ


新しき未来を創るために


         その力の源よ


今ここに


        その力を返さん!


                          」

🌞🌞🌞 🌞🌞🌞 🌞🌞🌞 🌞🌞🌞 🌞🌞🌞 🌞🌞🌞


        『天国にいけるC言語入門技』


🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓



アレサ「     



         Until reach the heaven天国にいけるまで



        

       cooperate and make it a success!協力して問題解決ですの



🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓



🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓



🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞



🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓



🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞


🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓


🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞


🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓


🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞


🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓


アレサ「


配列変数の仕組みを理解するために


次のプログラムを


統合開発環境EAZY IDECで


実行してみましょう。


以下のプログラムは


統合開発環境Visual Studioでは実行できません。


#include <stdio.h>


int main(void) {


char *hairetu="ru,tu,ru~";


char *hairetu="lalala";


char *hairetu="pikori~nn";


char hairetu[]="nekoneko";


char hairetu[]="tyunntyunn";


char hairetu[]="wonwon";


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

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

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

printf("%c\n", hairetu[3]);

printf("%c\n", hairetu[4]);

printf("%c\n", hairetu[5]);

printf("%c\n", hairetu[6]);

printf("%c\n", hairetu[7]);

printf("%c\n", hairetu[8]);

printf("%c\n", hairetu[9]);

printf("%c\n", hairetu[10]);

printf("%c\n", hairetu[11]);

printf("%c\n", hairetu[12]);

printf("%c\n", hairetu[13]);

printf("%c\n", hairetu[14]);

printf("%c\n", hairetu[15]);

printf("%c\n", hairetu[16]);

printf("%c\n", hairetu[17]);

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

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

return 0;


}



コンパイル結果


w

o

n

w

o

n


t

y

u

n

n

t

y

u

n

n


wonwon

0019FF31


アレサ「このコンパイル結果をみても

おわかりになられますように


メモリには

文字列データ"wonwon"のほかに

文字列データ"tyunntyunn"もメモリに格納されたままとなっています。


予想では

配列変数

hairetu[7]

hairetu[8]

hairetu[9]

hairetu[10]

には


hairetu[7]='u'

hairetu[8]='n'

hairetu[9]='n'

hairetu[10]='\0'


が格納されるとおもわれましたが


予想に反して


hairetu[7]='t'

hairetu[8]='y'

hairetu[9]='u'

hairetu[10]='n'


とデータが格納されています


これは


文字列データ"wonwon"がメモリに格納されると


           

          すなわち


1番最後に文字列データ"wonwon"がメモリに格納されると



     1番最後に文字列データ"wonwon"が



      格納されたメモリのアドレスが



     ポインタ変数hairetuに格納されます


   

         と同時に


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

文字列データ"wonwon"は

hairetu[0]='w'

hairetu[1]='o'

hairetu[2]='n'

hairetu[3]='w'

hairetu[4]='o'

hairetu[5]='n'

hairetu[6]='\0'


と格納されていきます。



           すなわち



配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

は最後に格納されたデータから優先して


配列変数

hairetu[0]

から

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]


順番に文字列データを格納していくのです


ですので


文字列データ"tyunntyunn"は


文字列データ"wonwon"が


hairetu[0]='w'

hairetu[1]='o'

hairetu[2]='n'

hairetu[3]='w'

hairetu[4]='o'

hairetu[5]='n'

hairetu[6]='\0'


と格納された後


配列変数

hairetu[7]から


hairetu[7]='t'

hairetu[8]='y'

hairetu[9]='u'

hairetu[10]='n'

hairetu[11]='n'

hairetu[12]='t'

hairetu[13]='y'

hairetu[14]='u'

hairetu[15]='n'

hairetu[16]='n'

hairetu[17]='\0'



のようにずれて格納されていくのです。」


ソーラー「なるほどそんな仕組みだったんだね。


つまり


メモリに文字列データ"wonwon"や"tyunntyunn"が格納されるんだけど


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

最後にメモリに格納された文字列データ"wonwon"

次に

その前に格納された

文字列データ"tyunntyunn"


という順に


配列変数

hairetu[0]

からはじまって

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[0]='w'

hairetu[1]='o'

hairetu[2]='n'

hairetu[3]='w'

hairetu[4]='o'

hairetu[5]='n'

hairetu[6]='\0'

hairetu[7]='t'

hairetu[8]='y'

hairetu[9]='u'

hairetu[10]='n'

hairetu[11]='n'

hairetu[12]='t'

hairetu[13]='y'

hairetu[14]='u'

hairetu[15]='n'

hairetu[16]='n'

hairetu[17]='u'

hairetu[18]='\0'


文字列データ"wonwon"

文字列データ"tyunntyunn"



配列変数に

格納しているんだね。」



ソーラー「となると


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


配列変数に文字列データが格納されることは


別々の話ということになるね。


メモリに文字列データが格納される場合は


もちろん


そのメモリに文字列データは固定して格納されていますが



配列変数

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]


に格納される文字列データは


最後に格納される文字列データによって


どんどん変化してしまうからね。


まるで


ポインタ変数ptaに変数bのアドレスを


pta=&b;


のように


代入すると


*ptaは変数bの格納している値をあらわすことになったように


ポインタ変数hairetuに

最後に格納された文字列データ"wonwon"のアドレスが


代入されると


hairetu

hairetu+1

hairetu+2

hairetu+3

hairetu+4

hairetu+5


には

最後に格納された文字列データ"wonwon"のアドレス


つまり


'w'

'o'

'n'

'w'

'o'

'n'

'\0'


を格納しているメモリのアドレスが


代入されることになり


char型の配列変数


hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[0]='w'

hairetu[1]='o'

hairetu[2]='n'

hairetu[3]='w'

hairetu[4]='o'

hairetu[5]='n'

hairetu[6]='\0'


のように文字列データ"wonwon"


の1文字をあらわすことになるんだね。


ポインタ変数hairetuと


配列変数

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

ポインタ変数ptaと

*ptaの関係にあるんだね」



🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓

🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞

🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓


🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞


🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓


🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞


🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓


🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞


🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓


🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞



🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓



🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞



🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓



🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞




🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓




🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞





🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓



ソーラー「やったね、アレサ」


アレサ「そうなんですの😊」


ソーラー「

まあ、


今の話は


同じhairetuという名前で


何度も

ポインタ変数宣言

配列宣言

をおこなってプログラムを実行することのできる


統合開発環境

EAZY IDEC


を使っていたからこそできたんだ。」



         ぴよ~~~~~ん


アレサ「はわわ」





統合開発環境EAZY IDEC「よばれたか~い」





アレサ「統合開発環境EAZY IDECさんがでてこられましたの」


ソーラー「人に希望を与える統合開発環境EAZY IDEC


は理想郷入りしてたってわけか!


たすかったよ。


さすがに


この問題はきみがいなければ解けなかったよ」



統合開発環境EAZY IDEC


「お役にたたて最高です!やっほぉ~~~~~い」


ぴょんぴょん  ぴよよ~ん、ぴよよ~ん 



ソーラー「こころづよいな 君のような仲間がいて」


ソーラー「


まあ

それでも


もともと(´▽`*)(´▽`*)


たくさん配列宣言やポインタ変数宣言をおこなって


文字列データを格納するときは


≪配列名やポインタ変数名は


同じものにならないようにしないといけないんだね。≫


いや・・・普通のことだったかも」