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

たくさん配列宣言やポインタ変数宣言をおこなうときは


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


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


solarplexuss

「うう、よくわかったよ~


でも、なんか めちゃめちゃ初歩的というか


普通のことをいってるような気がしないでもない・・・?」


ソーラー 「というわけで


安心できるよう 


いろんな文字列データを配列名を変えた別々の配列に格納してみます。」


アレサ「お願いしますね。ソーラーさん」


ソーラー 「では、文字列データ"apple","ringo","cashewnuts"


ここでcashewnutsとは


カシュー(学名: Anacardium occidentale、英名: Cashew [ˈkæʃuː]、葡名: Caju [kɐˈʒu]、和名: カシューナットノキ、勾玉の木)は、中南米原産のウルシ科の常緑高木。


その種子はカシューナッツと呼ばれ、食用とされる。アレルギー表示の特定原材料に準ずるものに指定されている。

われらのウィキペディアより


のことです


これらの3つの文字列データを


配列に格納していくよ。」


アレサ「勾玉の🌳‥‥


はっ


カシューナッツは勾玉の形をしている!!!」


ソーラー「でだしは上々だね。


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


同じものにならないように


配列

str[]

ars[]

arr[]


を用意し


その中に


それぞれ文字列データ

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",arr);

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


return 0;

}


コンパイル結果

apple

ringo

cashewnuts


ソーラー「あはっ簡単そのもの

char型の配列

str[]

ars[]

arr[]


の配列変数


str[0]

ars[0]

arr[0]



str[0]='a';

ars[0]='r';

arr[0]='c';



格納されている

apple

ringo

cashewnuts

先頭の文字データ


'a'

'r'

'c'


を格納しているメモリのアドレスはそれぞれ


次のプログラムにより


#include <stdio.h>

int main(void){


char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


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

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

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


return 0;

}

コンパイル結果


EAZY IDECの場合

0019FF52

0019FF4C

0019FF41


Visual Studioの場合


0053FE14

0053FE04

0053FEF0


となっています。


または


次のプログラムを実行して


#include <stdio.h>

int main(void){


char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


printf("%p\n",str);/*👈この部分で[0]がとれています*/

printf("%p\n",ars);/*👈この部分で[0]がとれています*/

printf("%p\n",arr);/*👈この部分で[0]がとれています*/


return 0;

}

EAZY IDECの場合

0019FF52

0019FF4C

0019FF41


Visual Studioの場合


0053FE14

0053FE04

0053FEF0


となっています。


わかりにくいかな😝?


printf("%p\n",str);/*👈この部分で[0]がとれています*/

printf("%p\n",ars);/*👈この部分で[0]がとれています*/

printf("%p\n",arr);/*👈この部分で[0]がとれています*/


の説明をしてみます



配列str内に生成される配列変数


str[0]

str[1]

str[2]

str[3]

str[4]

str[5]

には


str[0]='a';

str[1]='p';

str[2]='p';

str[3]='l';

str[4]='e';

str[5]='\0';


と文字データが格納され


配列ars内に生成される配列変数


ars[0]

ars[1]

ars[2]

ars[3]

ars[4]

ars[5]


には

ars[0]='r';

ars[1]='i';

ars[2]='n';

ars[3]='g';

ars[4]='o';

ars[5]='\0';

と文字データが格納され


配列arr内に生成される配列変数

arr[0]

arr[1]

arr[2]

arr[3]

arr[4]

arr[5]

arr[6]

arr[7]

arr[8]

arr[9]

arr[10]

には

arr[0]='c';

arr[1]='a';

arr[2]='s';

arr[3]='h';

arr[4]='e';

arr[5]='w';

arr[6]='n';

arr[7]='u';

arr[8]='t';

arr[9]='s';

arr[10]='\0';


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



str

ars

arrは


配列

str

ars

arr

のアドレスを

格納しているポインタ変数であり


同時に


配列

str

ars

arr

の各おのの先頭の

配列変数

str[0]

ars[0]

arr[0]

のアドレス

を格納しているポインタ変数となっています。


よって

配列

str

ars

arr

配列

str

ars

arr

の各おのの先頭の

配列変数

str[0]

ars[0]

arr[0]

のアドレスを表示するためには


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

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

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


👆このようにポインタ変数


str

ars

arr


を%p出力変換指定子を用いて


printf出力表示すれば


いいというわけなんです!。」



アレサ「いままでのエピソードでもみてきましたが


文字列データ

"apple"を格納しているメモリのアドレスでなく


文字列データ

”apple”を


printf出力表示したい場合は


下のように


%s出力変換指定子と


str[0]のアドレスを格納したポインタ変数strを


もちいて


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


とソースコードを記述します。」


ソーラー「そう そうだったね。


つまり


str[0]のアドレスを


格納したポインタ変数

str

配列

str

を代表するアドレスであり


配列strに格納されている文字列データを


%s出力変換指定子をもちいてprintf出力表示するときや


配列strに格納されている文字列データappleのアドレスを


%p出力変換指定子をもちいてprintf出力表示するとき


につかわれるんだね。」


アレサ「では、


ソーラーさんが 

配列をつかって


文字列データ

"apple"

"ringo"

"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


アレサ「とても簡単でした・・・(^_^)/


char *str="apple";

char *ars="ringo";

char *arr="cashewnuts";

が実行されると



このときも

ポインタ変数宣言

char *str="apple";により

配列変数


str[0]

str[1]

str[2]

str[3]

str[4]

str[5]

には


str[0]='a';

str[1]='p';

str[2]='p';

str[3]='l';

str[4]='e';

str[5]='\0';


と文字データが格納されます


ポインタ変数宣言

char *ars="ringo";


により


配列ars内に生成される配列変数


ars[0]

ars[1]

ars[2]

ars[3]

ars[4]

ars[5]


には

ars[0]='r';

ars[1]='i';

ars[2]='n';

ars[3]='g';

ars[4]='o';

ars[5]='\0';

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


ポインタ変数宣言

char *arr="cashewnuts";

により

配列arr内に生成される配列変数

arr[0]

arr[1]

arr[2]

arr[3]

arr[4]

arr[5]

arr[6]

arr[7]

arr[8]

arr[9]

arr[10]


には

arr[0]='c';

arr[1]='a';

arr[2]='s';

arr[3]='h';

arr[4]='e';

arr[5]='w';

arr[6]='n';

arr[7]='u';

arr[8]='t';

arr[9]='s';

arr[10]='\0';



と文字データが格納されます


そして


ポインタ変数

str

ars

arr

の格納しているアドレス番号のついたメモリを先頭に


文字列データ

"apple"

"ringo"

"cashewnuts"


メモリに格納されています。」


ソーラー「


このとき


ポインタ変数

str

ars

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


となり


ポインタ変数strに格納されているアドレスは00402000

ポインタ変数arsに格納されているアドレスは00402006

ポインタ変数arrに格納されているアドレスは0040200C


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


アドレス

00402000

00402006

0040200C


ポインタ変数

str

ars

arr

を使って

文字列データ

"apple"

"ringo"

"cashewnuts"


をメモリに格納するときの


配列変数

str[0]

str[1]

str[2]

str[3]

str[4]

str[5]


配列変数


ars[0]

ars[1]

ars[2]

ars[3]

ars[4]

ars[5]


配列変数


arr[0]

arr[1]

arr[2]

arr[3]

arr[4]

arr[5]

arr[6]

arr[7]

arr[8]

arr[9]

arr[10]


の先頭の配列変数

str[0]

ars[0]

arr[0]


のアドレスでもあり


同時に


文字列データ

"apple"

"ringo"

"cashewnuts"

を格納している配列変数を代表するアドレス

にも

なっています。」



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

作者を応援しよう!

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

応援したユーザー

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