複数の文字列データを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
に
それぞれ文字列データ
"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"
を格納している配列変数を代表するアドレス
にも
なっています。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます