配列に数値データを格納した場合の配列や配列変数のアドレスはどうなっているのでしょうか?調べてみます。
アレサ「ソーラーさん、
int型の配列宣言
int hairetu[3]={1,2,3};
によって生成される
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
のアドレスを格納しているポインタ変数が
hairetu
hairetu+1
hairetu+2
とわかったところで
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
のアドレスをしらべてみましょう。
ここでおさらいすると・・・」
ソーラー「お皿洗いすると・・・」
アレサ「・・・」
ソーラー「・・・つづきをお願い・・・」
アレサ「はいっ😊ソーラーさん
配列宣言
int hairetu[3]={1,2,3};
が行われた時点で
ポインタ変数hairetuにはすでに
整数値データ1を格納したhairetu[0]のアドレス
&hairetu[0]が格納されていました。
ポインタ変数hairetu+1にはすでに
整数値データ2を格納したhairetu[1]のアドレス
&hairetu[1]が格納されていました。
ポインタ変数hairetu+2にはすでに
整数値データ3を格納したhairetu[2]のアドレス
&hairetu[2]が格納されていました。
ですのでhairetu[0]のアドレスを表示するためには
printf(%p,hairetu);
と記述し
ですのですのでhairetu[1]のアドレスを表示するためには
printf(%p,hairetu+1);
と記述し
ですのですのですのでhairetu[2]のアドレスを表示するためには
printf(%p,hairetu+2);
と記述し
命令文を実行すればよいわけですね。ソーラーさん」
ソーラー「そうですのやね、アレサ
どんなふうに
連続したint型の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
の
アドレスが表示されるか
ちょっと実験するのもいいかもしれない。
プログラムを構成して・・」
#include <stdio.h>
int main(void){
int hairetu[]={1,2,3};
printf("%p\n",hairetu);
/*(hairetu[0]のアドレスを表示します)*/
printf("%p\n",hairetu+1);
/*(hairetu[1]のアドレスを表示します)*/
printf("%p\n",hairetu+2);
/*(hairetu[2]のアドレスを表示します)*/
return 0;
}
ソーラー「コンパイルっっと😊」
コンパイル結果
0019FF4C
0019FF50
0019FF54
ソーラー 「どうやら
hairetu[0]
hairetu[1]
hairetu[2]
のアドレスは隣同士のようだね。
?
0019FF50の次は0019FF51じゃないかって?
整数値データ1は
int型(4バイト)の
配列変数hairetu[0]に格納されています
つまり
整数値データ1は4バイトの領域にわたってデータが格納されています。
つまりのつまり
(4バイト=)1バイトのお部屋4つ分にわたって
00000000 00000000 00000000 00000001
と
データが格納されています。
コンピュータはメモリの1バイトのお部屋ごとにアドレスをつけているので
整数値データ1を格納しているint型の配列変数hairetu[0]は
0019FF4Cを先頭に
0019FF4C
0019FF4D
0019FF4E
0019FF4F
のアドレス番号の
4つのお部屋をもち
数値1のデータは この4つのお部屋にまたがって
00000000 00000000 00000000 00000001
👆 👆 👆 👆
1バイト 1バイト 1バイト 1バイト
と格納されています
(16進数で0019FF4Fの次の数値は0019FF50となります。
solarplexussより)
数値2を格納しているint型の配列変数hairetu[1]
は0019FF50を先頭に
0019FF50
0019FF51
0019FF52
0019FF53
のアドレス番号がついた
4つのお部屋をもち
数値2のデータは この4つのお部屋にまたがって
00000000 00000000 00000000 00000010
👆 👆 👆 👆
1バイト 1バイト 1バイト 1バイト
と格納されています
数値3を格納しているint型の配列変数hairetu[2]
は0019FF54を先頭に
0019FF54
0019FF55
0019FF56
0019FF57
のアドレス番号の
4つのお部屋をもち
数値3のデータは この4つのお部屋にまたがって
00000000 00000000 00000000 00000011
👆 👆 👆 👆
1バイト 1バイト 1バイト 1バイト
と格納されています
(^_-)-☆パチっ」
アレサ「
配列変数hairetu[0]
配列変数hairetu[1]
配列変数hairetu[2]
はデータを格納するお部屋を4つもっていても
printf("%p\n",hairetu);
/*(hairetu[0]のアドレスを表示します)*/
printf("%p\n",hairetu+1);
/*(hairetu[1]のアドレスを表示します)*/
printf("%p\n",hairetu+2);
/*(hairetu[2]のアドレスを表示します)*/
return 0;
を実行した場合
その先頭のお部屋のアドレスしか表示されないのですね。」
ソーラー「そうだねぇ~ほんとだね。
配列hairetuに格納されているすべての
お部屋のアドレスは
0019FF4C
0019FF4D
0019FF4E
0019FF4F
0019FF50
0019FF51
0019FF52
0019FF53
0019FF54
0019FF55
0019FF56
0019FF57
となってるよ
hairetu[0]のアドレスをもとめたときは
先頭の0019FF4Cが表示されたよね
そしてなおかつ
アドレス0019FF4Cは
配列hairetuが格納している全アドレス
0019FF4C
0019FF4D
0019FF4E
0019FF4F
0019FF50
0019FF51
0019FF52
0019FF53
0019FF54
0019FF55
0019FF56
0019FF57
の先頭のアドレスになっているよね
つまり
ポインタ変数hairetuに格納されている
hairetu[0]の
アドレス0019FF4Cは
配列hairetuの先頭のアドレスであり
配列hairetuを代表するアドレスといえるんじゃな~い😊かな」
アレサ「確かに
printf("%p\n",hairetu);
/*hairetu[0]に格納されているアドレスを表示する*/
を実行すれば
hairetu[0]のアドレスがわかります
配列hairetuは
hairetu[0]のアドレスのメモリから数値を格納しはじめているのです。」
🐦 🐦
実際に
printf("%p\n",hairetu);ってかくと
hairetu[0]のアドレスを表示しているんだけど
配列hairetuのアドレスを表示していることにもなります
solarplexussより
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます