第7講 ポインタ
第2話 ポインタの簡単な実例
本講義の方針は、先に事例を示すですから、
いつもの通り具体例を示してから、
解説していくことにしましょう。
#include<stdio.h>
void f(); //関数f()のプロトタイプ宣言
int main() {
f(); //関数f()に仕事を命じている
return(0);
}
void f() {
int a,*b; //変数aとポインタbの宣言
a = 1; //箱aに1を入れる
b = &a; //住所を収納する箱bに箱aの住所を代入
printf("a =%d\n", a); //箱aの中身を表示
printf("&a=%d\n", &a); //箱aの住所を表示
printf("b =%d\n",b); //住所を収納する箱の中身を表示
}
実行結果
(住所=アドレスは毎回変わりますので、
皆さんの実行結果とは同じではありません。)
変数のことを今まで箱と説明してきましたが、
正確に説明すると、メモリです。
記憶装置のある場所に一定容量のメモリを割り振り、
そのメモリにデータ書き込むものが変数です。
つまり、変数には住所=アドレスがあるのです。
&aは変数の住所を意味します。
記憶装置の13040124が変数aの住所というわけです。
変数bは変数の住所を収納する変数です。
箱の住所を収納する箱がC言語には用意されていて、
箱の住所を収納する箱をポインタ変数というのです。
int *b;
と宣言すると、ポインタ変数bが用意されます。
つまり、箱の住所を収納する箱bが用意されるのです。
int b;
と宣言したのでは、ただのデータを収める箱bが定義されてしまいますので、
int *b;
によって、はじめて住所を収納する箱bが用意できるとC言語は定めているのです。
先のコードに1行を加えて、
#include<stdio.h>
void f(); //関数f()のプロトタイプ宣言
int main() {
f(); //関数f()に仕事を命じている
return(0);
}
void f() {
int a,*b; //変数aとポインタbの宣言
a = 1; //箱aに1を入れる
b = &a; //住所を収納する箱bに箱aの住所を代入
printf("a =%d\n", a); //箱aの中身を表示
printf("&a=%d\n", &a); //箱aの住所を表示
printf("b =%d\n",b); //住所を収納する箱の中身を表示
printf("*b =%d\n",*b); //住所を収納する箱の中身を表示
}
とすると実行結果は、
(アドレスは毎回変わるのでしたね。)
するとaと*bは同じということになります。
*と&の関係を表にしておくと
箱 | 箱の住所 | |
int a;と宣言 | a | &a |
int *b;と宣言 | *b | b |
ということになります。
つまり、*bは住所14250480に箱に入っている中身の値を意味するのです。
でしたら、コードを次のように書き換えることは出来るでしょうか。
#include<stdio.h>
void f(); //関数f()のプロトタイプ宣言
int main() {
f(); //関数f()に仕事を命じている
return(0);
}
void f() {
int *b; //ポインタbの宣言
*b = 1; //箱*bに1を入れる
printf("*b =%d\n", *b); //箱*bの中身を表示
printf("b=%d\n", b); //箱*bの住所を表示
}
コードには赤い波線が表示されていませんので、
問題なさそうですが、−−−