天国にいけるC言語入門 ヘキサ構造体 ver2.2126
文字列データを格納するchar hairetu[ ]="nekoneko";とchar *hairetu="nekoneko";の構造を文字列データが格納される場所のアドレスを求めて比較してみますw
メモリに最後に格納された文字列データが配列変数に格納されるので配列変数に格納される文字列データは変化していきます。メモリに文字列データが格納されることと配列変数に文字列データが格納されることは別々の話
文字列データを格納する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出力表示することになるのですが
ポインタ
最後に文字列データを格納したメモリ領域の先頭のメモリのアドレスが
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言語入門技』
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
アレサ「
Un
cooperate an
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞🌞
🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓🍓
アレサ「
配列変数の仕組みを理解するために
次のプログラムを
統合開発環境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
「お役にたたて最高です!やっほぉ~~~~~い」
ぴょんぴょん ぴよよ~ん、ぴよよ~ん
ソーラー「こころづよいな 君のような仲間がいて」
ソーラー「
まあ
それでも
たくさん配列宣言やポインタ変数宣言をおこなって
文字列データを格納するときは
≪配列名やポインタ変数名は
同じものにならないようにしないといけないんだね。≫
いや・・・普通のことだったかも」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます