コンピュータで利用されるメモリ(記憶装置)は、本やノートの「ページ」の概念が似ている。
例えば以下の例では、ノートの3ページ目に37という数字が書かれている。
この「ある場所に、あるデータが書かれている」というところが似ている。
C言語ではポインタ演算子「&」を使うと、変数が割り当てられている場所(アドレス、番地とも言う)を知ることができる。
例えば以下のようなコードを実行してみる。
int a = 37; // 変数の場所は不明
printf("%d",&a);
結果は、例えば以下のようになる。
1244892
変数a は 1244982 というアドレスに割り当てられていたことがわかる。
(コンピュータの世界ではアドレスを16進数で表すので16進数では 0x12FEDC となる。)
(ちなみに ゲームボーイアドバンスでは 0x04000132 番地に、「キーが押されている状況」が格納されている)
■ポインタ変数
アドレスも単なる数字であるが、アドレスを入れるため専用の変数が用意されており、これを「ポインタ変数」と呼ぶ。
ポインタ変数は「int *p;」のように定義できる。
int a = 37;
int *p = &a; // &a で a のアドレスを取得
int *p は「アドレスを入れるポインタ変数p を定義する。ポインタが指している先のデータ型は int である」という意味になる。
以上の例では a のアドレスが 1244892 (12FEDC) であった場合、p には 1244892 (12FEDC) が入る。
ここで *p の「*」は、「ポインタ変数である」ということを意味している。
■ポインタ演算子 *
ポインタ変数に対して、ポインタが指している先のデータを取得するための演算子*も用意されている。
ポインタ変数の直前に書いて使うことができる。
かけ算の「*」や、ポインタ変数定義に用いる「*」と同じ記号であるために紛らわしいが使われ方が違っていることに注意が必要である。
int *p;
p = &a;
printf("%d" ,*p); // *p は p が指す先の値
結果は、例えば以下のようになる。
1244892
■演習1
hellopointer.c
#include <stdio.h>
void main (void){
int a=37; // 普通の変数
int *p; // ポインタ変数
p = &a; // p に a のアドレスを代入
printf("a = %d \n",a);
printf("&a = %d \n",&a);
printf("p = %d \n",p);
printf(“*p = %d \n”,*p); // *
printf("&p = %d \n",&p); // &
}
■演習2
教科書205ページ練習問題
リスト (p205list.c)
#include <stdio.h>
int main(void){
int mydt;
mydt = 1234;
printf("mydt=%d\n",mydt);
printf("mydtのアドレス=%p\n",&mydt);
return 0;
}
■演習3
教科書207ページ練習問題
リスト (p207list.c)
#include <stdio.h>
int main(void){
int *pt;
int mydt=1234, idt;
pt=&mydt;
idt=*pt;
printf("値 mydt=%d\n",mydt);
printf("値 *pt =%d\n",*pt);
printf("値 idt =%d\n",idt);
mydt=555;
printf("値 mydt=%d\n",mydt);
printf("値 *pt =%d\n",*pt);
*pt=666;
printf("値 idt =%d\n",idt);
printf("値 *pt =%d\n",*pt);
return 0;
}
以上、演習で作成したソースコードをメールにて提出すること。
■応用 main 関数のアドレスを取得する
#include <stdio.h>
void main(void){
void *p = main;
printf("%p",p);
}
C:\myc>hellomainpointer.exe
00401000
■応用 配列のアドレスを取得する
#include <stdio.h>
void main(void){
int a[] = {1,3,5,7,9};
int n=0;
for(n=0;n<5;n++){
printf("%p %d\n",&(a[n]),a[n]);
}
}
C:\myc>helloarraypointer.exe
0012FED0 1
0012FED4 3
0012FED8 5
0012FEDC 7
0012FEE0 9