ポインターは、メモリーと密接に関わっている。ポインターを学習する前に、簡単にコン
ピューターの構造を学習した。その内容は、以下の通り。
- 図7がコンピューターの基本構成である。
- 制御装置と演算装置、記憶装置、入力装置、
出力装置をコンピューターの五大装置と呼び、それぞれには以下の働きがある。
- 制御装置
- 主記憶装置(メインメモリー)に格納されているプログラムを
受け取り、各装置に指令を出す。
- 演算装置
- 主記憶装置の中にあるデータを受け取り、制御装置の指令に
従い、それを処理する。
- 記憶装置
- 主記憶装置と補助記憶装置がある。
- 主記憶装置
- 命令とデータからなるプログラムを格納する。
- 補助記憶装置
- 大容量、あるいは半永久的に残したいデータを補助記憶
装置に格納する。
- 入力装置
- コンピューターの外部からデータを取り込む装置である。
- 出力装置
- 主記憶装置に格納されているデータをコンピューター外部に
出力する装置である。
- 制御装置と演算装置をまとめて中央制御装置(CPU:Central Processing Unit)ある
いは、 MPU(Micro Processing Unit) と言う。
- 2進数の1桁が1ビットである。
- 諸君が使っているパソコンのアドレスは32ビットで表現されている。これは16進
数では8桁である。
- 一つのアドレスに8ビット(1バイト)記憶できる。これは、16進数2桁で表現できる。
- 8ビットを1バイトと言う。
- 諸君が使っているコンパイラーでは、変数は表1に示し
ているバイト数で表現されている。
表 1:
変数の型とバイト数
型名 |
データ型 |
バイト数 |
ビット数 |
文字型 |
char |
1 |
8 |
整数型 |
int |
4 |
32 |
倍精度実数 |
double |
8 |
64 |
- プログラムは命令とデータから構成され、いずれもメモリーの中に格納される。
- プログラムの関数(これが命令)が格納されるアドレスは、関数名で参照できる。
- データが格納されるアドレスは、データ名の前に&を付けることで参照で
きる。& はアドレス演算子である。
- アドレスの表示には変換指定子 %pを使う。
- ローカル変数は名前が同じでも、メモリーの配置場所は異なる。正確言うと、そ
の関数が呼び出されたときのみ、ローカル変数はメモリーに割り当てられる。
- ポインターとは、アドレスを格納する変数のことである。
- ポインターの宣言には、型名とアスタリスク(*)を付ける。
int *pi;
double *px;
- 変数のアドレスを取り出すには、変数名の前にアンパサンド(&)をつける。
&はアドレス演算子である。以下の例では、piとpxがポインター
で、変数iとxのアドレスを、それに代入している。
pi=&i;
px=&x;
- ポインターが示しているデータの値を取り出すためには、ポインター変数の前に
アスタリスク(*)をつける。*は間接参照演算子である。つぎの例は、
ポインターpiとpxが指し示しているアドレスにある値を取り出して、
変数jとyに代入している。
j=*pi;
y=*px;
- リスト2のプログラムをよく理解すること。
- 4行
- 整数型のポインターpを宣言している。pに整数型のデータの先頭
アドレスを格納する。
- 5行
- 整数型の変数 i を宣言し、
を代入している。
- 7行
- 変数 i の先頭アドレスをアドレス演算子 &により取り出し、ポインター
p に代入している。
- 9行
- 整数変数 i の先頭アドレスを変換指定子 %p により表示している。
- 10行
- ポインター p の先頭アドレスを変換指定子 %p により表示している。
- 12行
- 整数変数 i の値を16進数表示の変換指定子 %0x により表示している。
- 13行
- ポインター p の値を16進数表示の変換指定子 %0x により表示してい
る。ただし、ポインターはアドレスなので、強制型変換(キャスト)により、
符号なし整数にしている。
- 15行
- ポインターが指し示すアドレスに格納されているデータを表示している。
1 #include <stdio.h>
2
3 int main(void){
4 int *p;
5 int i=0x11223344;
6
7 p=&i;
8
9 printf("address i %p\n", &i);
10 printf("address p %p\n", &p);
11
12 printf("value i %0x\n", i);
13 printf("value p %0x\n", (unsigned int)p);
14
15 printf("value *p %0x\n", *p);
16
17 return 0;
18 }
address i 0xbffff6b0
address p 0xbffff6b4
value i 11223344
value p bffff6b0
value *p 11223344
この実行結果から、メモリーは図
8のようになっていること
が分かる。
図 8:
リスト2のプログラム実行後のメモリーの内容
|
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成17年10月27日