配列に文字列データを格納した場合の配列や配列変数のアドレスはどうなっているのでしょうか?調べてみます。
アレサ 「ソーラーさん!(^^)! 」
ソーラー「はい(^▽^;)」
アレサ 「先のエピソードでは
int型の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
に整数値データを格納したときの
int型の配列変数の
アドレスを配列のポインタ変数を使って調べることができましたの。」
ソーラー「はい(#^.^#)」
アレサ 「今度はhairetuのchar型の配列宣言をおこない
作製されたchar型の配列hairetuに文字列データを格納してみます
文字列データが"neko"なら
文字列データは
char型の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
に
hairetu[0]='n';
hairetu[1]='e';
hairetu[2]='k';
hairetu[3]='o';
hairetu[4]='\0';
と1バイトずつ(8ビットずつ)
格納されていくのでした
(文字データ
'n'
'e'
'k'
'o'
'\0'
は1バイト(8ビット)のデータ量を持っているのでした)
そのときの
char型の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
の
アドレスを
配列変数のアドレスを格納するポインタ変数を使って調べてみませんか。」
ソーラー「は、はい、がっつり邁進させていただきます。」
アレサ 「さあ、いきますよ(*´▽`*)ソーラーさん」
ソーラー「わおっ最高だね😊」
アレサ 「それでは
まず配列に文字列データを格納するので
char型の配列宣言をおこないます。
そうして作製された配列に
文字列データ"neko"を格納してみます。
char hairetu[5]="neko";
あるいは
char hairetu[5];
hairetu[0]='n';
hairetu[1]='e';
hairetu[2]='k';
hairetu[3]='o';
hairetu[4]='\0';
と命令文を記述すればよかったのですね。
このように
配列hairetuを生成し
配列hairetuに文字列データ"neko"を格納しているので
文字データ'n'を格納した配列変数
hairetu[0]
のアドレスを格納しているポインタ変数hairetu
文字データ'e'を格納した配列変数
hairetu[1]
のアドレスを格納しているポインタ変数hairetu+1
文字データ'k'を格納した配列変数
hairetu[2]
のアドレスを格納しているポインタ変数hairetu+2
文字データ'o'を格納した配列変数
hairetu[3]
のアドレスを格納しているポインタ変数hairetu+3
文字データ\0を格納した配列変数
hairetu[4]
のアドレスを格納しているポインタ変数hairetu+4
が存在することになります
これらのポインタ変数
hairetu
hairetu+1
hairetu+2
hairetu+3
hairetu+4
を使って
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
のアドレスをもとめてみますよ。」
ソーラー「は~い」
アレサ「それでは
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
のアドレスをもとめるプログラムを構成してみます。
#include <stdio.h>
int main(void){
char hairetu[5];
hairetu[0]='n';
hairetu[1]='e';
hairetu[2]='k';
hairetu[3]='o';
hairetu[4]='\0';
printf("%p\n",hairetu);
/*hairetu[0]のアドレスを表示する*/
printf("%p\n",hairetu+1);
/*hairetu[1]のアドレスを表示する*/
printf("%p\n",hairetu+2);
/*hairetu[2]のアドレスを表示する*/
printf("%p\n",hairetu+3);
/*hairetu[3]のアドレスを表示する*/
printf("%p\n",hairetu+4);
/*hairetu[4]のアドレスを表示する*/
return 0;
}
(EAZY IDECの場合)
コンパイル結果
0019FF53
0019FF54
0019FF55
0019FF56
0019FF57
(Visual Studioの場合)
ビルド実行結果
007CFD20
007CFD21
007CFD22
007CFD23
007CFD24
ソーラー「おおうっ
ビルド実行結果に
綺麗に16進数が1ずつ値を大きくしながら順番にならんでる。
なんと・・・
さきほど数値データを
int型の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
に格納したときは
int型の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
のアドレス
&hairetu[0]
&hairetu[1]
&hairetu[2]
は
0019FF4C
0019FF50(0019FF4C足す4が0019FF50です)
0019FF54(0019FF50足す4が0019FF54です)
のように4つの数値おきに表示されていたよね。
int型の配列変数に
数値データが格納されるとき
その数値データは4バイトのメモリにわたって格納されます
つまり
int型の配列変数は
4バイトのデータ格納容量をもつんだったね。
その4バイトの中の1バイトごとにアドレスはつけられているので
int型の配列変数
hairetu[0]
なら
0019FF4C
0019FF4D
0019FF4E
0019FF4F
の4つのアドレスをもつというわけです。
このとき
int型の配列変数
hairetu[0]
のアドレス
&hairetu[0]
は
0019FF4C
0019FF4D
0019FF4E
0019FF4F
の先頭の
0019FF4Cで表されるんでしたね。
同様に
int型の配列変数
hairetu[1]
のアドレス
&hairetu[1]
は
0019FF50
0019FF51
0019FF52
0019FF53
の先頭の
0019FF50で表されるんでしたね。
同様に
int型の配列変数
hairetu[2]
のアドレス
&hairetu[2]
は
0019FF54
0019FF55
0019FF56
0019FF57
の先頭の
0019FF54で表されるんでしたね。
そのため
int型の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
のアドレスをprintf出力表示すると
0019FF4C
0019FF50
0019FF54
のように
4つとびで
コンパイル結果に表示されていました。
それに対し
文字データは
1バイトのデータ格納容量を持つ
char型の配列変数に格納されています
メモリには1バイトごとにアドレスが割り振られているので
1バイトのデータ格納容量を持つchar型の配列変数は
1つのアドレスをもっているわけです。
ですから
printf("%p\n",hairetu);
/*hairetu[0]のアドレスを表示する*/
printf("%p\n",hairetu+1);
/*hairetu[1]のアドレスを表示する*/
printf("%p\n",hairetu+2);
/*hairetu[2]のアドレスを表示する*/
printf("%p\n",hairetu+3);
/*hairetu[3]のアドレスを表示する*/
printf("%p\n",hairetu+4);
/*hairetu[4]のアドレスを表示する*/
が実行されると
コンパイル結果
0019FF53
0019FF54
0019FF55
0019FF56
0019FF57
と表示されたことからも分かるように
文字データ'n'は0019FF53のアドレスをもつchar型の配列変数hairetu[0]に
文字データ'e'は0019FF54のアドレスをもつchar型の配列変数hairetu[1]に
文字データ'k'は0019FF55のアドレスをもつchar型の配列変数hairetu[2]に
文字データ'o'は0019FF56のアドレスをもつchar型の配列変数hairetu[3]に
ナル文字\0は0019FF57のアドレスをもつchar型の配列変数hairetu[4]に
1つずつアドレス番号を増やしながら格納されています。」
アレサ「ここでchar型の配列hairetu内には
0019FF53
0019FF54
0019FF55
0019FF56
0019FF57
のアドレスを持つ5つの配列変数がつくられています。
そしてhairetu[0]のアドレスをもとめるために
printf("%p\n",hairetu);
を実行すれば
0019FF53と表示されますが
0019FF53は
配列変数
hairetu[0]のアドレスを表しているだけでなく
この配列hairetu内に文字データを格納し始める最初のお部屋の
アドレスとなっています。
つまり0019FF53は配列hairetu自体を代表するアドレス
となっているのですね」
ソーラー「やったね、アレサ、これもなんか簡単だったね。(*'▽')」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます