Transcript 配列とメモリの関係
プログラミングⅠ(1&2組)
第11回
http://www.fit.ac.jp/~matsuki/lecture.html
オフィス・アワーのお知らせ
• オフィス・アワーを以下の要領で開講
– 日時:毎週月曜日、5時限目(16:20~)
– 場所:A棟 4階 41番教室
– 内容:プログラミング関連科目
タイピングソフト
• 喰人王を使用して結果を記録する
• ステージ:第一の店(中華)
• Excelのシートにスコアを毎回記録していく
– 残り時間 ⇒ FeedBackページで報告
– 総タイプ数
– ミスタイプ数
– 正確さ ⇒ FeedBackページで報告
– 喰いっぷり ⇒ FeedBackページで報告
• このシートは,途中で提出してもらいます
今日の内容
• 配列の復習
• 配列とメモリの関係
• 多バイト型のメモリ配置
– リトルエンディアン
– ビッグエンディアン
前回の復習(配列)
前回の復習(配列)
• 配列(array):同じ型のデータの集合
• 宣言方法:
int a[5];
//int型で要素数が5
double x[10]; //double型で要素数が10
配列名
int
a[5];
データ型
要素数
(全部でいくつの器
を用意するか?)
a[0]
a[1]
a[2]
a[3]
a[4]
添字
(そえじ)
配列
プログラム例(使い方)
int main()
{
int a[5]; //配列の宣言
int b[3] = {10, 20, 30};
//配列の初期化
a[0] = 200;
//値の代入
a[1] = 400;
a[2] = a[0] + a[1] + b[0];
//値の参照
}
配列は,もっとも単純なデータ構造
プログラム例
#include <stdio.h>
main()
a[4]
a[0]
{
int data[5] = {10, 20, 40, 80, 160};
kは0から4まで
int k;
for (k = 0; k < 5; k++) {
printf(“data[%d] = %d\n”,k, data[k]);
}
}
配列の関数への受け渡し
• 呼び出し側
– 配列名を引数の位置に書く
int data[5] = {10, 20, 30, 40, 50};
func(data);
• 関数側
– 引数位置には,配列の型,配列名,大括弧を記述
func(int x[])
xという配列名で配列
{
dataを受け取っている
printf(“data[0] は %d”, x[0]);
}
配列の関数への受け渡し
• 配列の要素すべてを表示する関数display()
– 関数名:display
– 戻り値の型:void型
– 引数:int型配列data,int型size
– 機能:引数data配列の要素をすべて画面に表示
プロトタイプ宣言
void display(int data[], int size);
または
void display(int [] , int);
#include <stdio.h>
void display(int data[], int size);
プロトタイプ宣言
main()
{
int point[5] = {75, 100, 85, 56, 68};
display(point, 5);
}
void display(int data[], int size)
{
int k;
for (k=0; k<size; k++) {
printf(“%2d ”,data[k]);
}
printf(“\n”);
}
配列とメモリの関係
配列とメモリの関係
int main()
{
9
6
3
8
char x[5]; //配列の宣言(5つの要素)
x[0] = 9;
x[0] x[1] x[2] x[3]
イメージ
x[1] = 6;
x[2] = 3;
住所(メモリアドレス)
x=10 11 12 13
x[3] = 8;
9
6
3
8
??
メモリ内
x[4] = 4;
10番地
return 0;
11番地
x+0番地
}
x+1番地
配列名 ⇒ 実は,配列データの先頭の住所(アドレス)
上記の例では,xには10(番地)が入っている.
4
x[4]
14
4
??
??
12番地
x+2番地
13番地
x+3番地
14番地
x+4番地
表示開始
配列とメモリの関係
アドレス
0012FF10
番地
アドレス 0012FF10~0013012Fまでの
メモリの様子
0013012F
番地
デバッグ⇒ウィンドウ⇒メモリ
配列とメモリの関係
0012FF18番地 = x
x[0]
x[1] x[2] x[3]
x[4]
x[0]
0012FF18番地の値
(x + 0)番地の値
x[1]
x[2]
0012FF19番地の値
0012FF1A番地の値
(x + 1)番地の値
(x + 2)番地の値
x[3]
x[4]
0012FF1B番地の値
0012FF1C番地の値
(x + 3)番地の値
(x + 4)番地の値
配列とメモリの関係
• 配列の要素は,メモリ領域に連続して確保さ
れる
• 配列の大きさは,プログラム開始時に決まる
ので,プログラム実行途中でそれを変更する
ことは出来ない(静的なメモリ確保)
• 配列名そのものは,配列の先頭要素のアドレ
ス
• 大括弧[]は演算子で,A[B]の本当の意味は,
『アドレス(A+B)番地の中身』
メモリ番地をのぞいてみよう
#include <stdio.h>
int main()
{
char x[5] = {1, 2, 3, 4, 5};
printf(“配列xの先頭アドレスは、%xです\n”,x);
x[0] = 6;
x[1] = 7;
}
メモリ番地を調べる方法
変数がメモリのどこに格納されているのか(メモリ
番地)を調べるには、「&」アドレス演算子を使う。
&x
メモリ番地をのぞいてみよう
#include <stdio.h>
int main()
{
char a = 9;
char x[5] = {1, 2, 3, 4, 5};
printf(“配列xのアドレスは、%xです\n”,x);
printf(“変数aのアドレスは、%xです\n”, &a );
printf(“x[3]のアドレスは、%xです\n”,&(x[3]));
}
多バイトの配置方法
• インテル(x86系):リトルエンディアン(Little Endian)
• モトローラ:ビッグエンディアン(Big Endian)
char a = 0x89;
int x = 0x12345678;
0
12FE30
1
2
03
12FE40
45
12FE50
87
55
//char型(0x12FE48)
//int型(0x12FE33~0x12FE36)
3
4
5
6
78
56
34
12
26
07
0F
21
CF
7
8
9
A
B
A0 FF
D
27
89 12 50 01
FF
C
54
01 03 05 07 09
E
F
多バイトの配置方法
xは,int型の配列 (サイズ3)で,xの値は0x12FE30とする
(1) x
(2) x[2]
(3) &x[1]
(4) x+2
12FE30
0
1
2
3
78
56
34
12
F0 DE BC 9A
73 46 3A 10
26
07
89 12 50 01
12FE40
45
12FE50
87
55
4
5
0F
CF
6
7
21
FF
8
9
A
B
C
D
54
01 03 05 07 09
E
F