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

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


アレサ「それでは、


配列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";


が実行されると


あるメモリに文字列データ"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がprintf出力表示されることにあるのですの。



          もし


次のように

プログラムの中で

同じ名前の

ポインタ変数宣言

配列宣言

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";//5行目と6行目を入れ替えました

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]

に格納されているデータは


1番最後にメモリに格納されたデータにおきかわっている・・・か・・・」




配列変数


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

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]


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


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


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


配列変数はメモリに格納されたデータに


アクセスする窓の役割をはたしているんだね」



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

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

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

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

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

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

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

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

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

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

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


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


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


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


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


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


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


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



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



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



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



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




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




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





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



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


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


ソーラー「

まあ、


今の話は


同じhairetuという名前で


何度も

ポインタ変数宣言

配列宣言

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


統合開発環境

EAZY IDEC


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



         ぴよ~~~~~ん


アレサ「はわわ」





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





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


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


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


たすかったよ。


さすがに


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



統合開発環境EAZY IDEC


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


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



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


ソーラー「


まあ

それでも


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


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


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


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


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


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






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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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