第7講 ポインタ
第9話 なぜポインタというの?
(以下は初心者の方には難しいと思いますので、
読み飛ばすか、軽く読んでそういうものなんだと受け取るかにして下さい。)
ポインタは箱の住所を収納する箱です。
第3話に扱ったコードを
#include<stdio.h>
#include<stdlib.h> //malloc()が使えるようにインクルード
void f(); //関数f()のプロトタイプ宣言
int main() {
f(); //関数f()に仕事を命じている
return(0);
}
void f() {
int *b = (int *)malloc(sizeof(int)); //ポインタbの宣言と初期化
*b = 1; //箱*bに1を入れる
printf("*b =%d\n", *b); //箱*bの中身を表示
printf("b =%d\n", b); //箱*bの住所bを表示
}
を例にすると、
(メモリは毎回変わりますので、と一致していません。
ですから、上の数字は仮の数字です。)
bは住所によって、*bを指し示しめしています。
そこで、bを*bへのポインタという言い方をします。
では、
#include<stdio.h>
#include<stdlib.h> //malloc()が使えるようにインクルード
void f(); //関数f()のプロトタイプ宣言
int main() {
f(); //関数f()に仕事を命じている
return(0);
}
void f() {
int *b = (int *)malloc(sizeof(int )); //ポインタbの宣言と初期化
int **c;
*b = 1;
printf("箱*bの中身 =%d\n", *b);
printf("箱*bの住所 =%d\n", b);
c = &b;
printf("箱bの住所 =%d\n", c);
}
の場合はどうでしょうか。
実は住所を入れる箱bも住所を持っています。
bも変数にすぎないのでメモリ番地を持っているのです。
ポインタ変数(メモリアドレス=メモリ番地を収納する箱)自体もメモリ番地を持っています。
(もちろんc自身にもメモリ番地があります。)
cはbの住所によってポインタbを指し示していますので、
ポインタへのポインタといいます。
私自身は〜へのポインタという表現は好きではありませんから、
基本、本サイトではそのような表現は取りませんが、
もし他のサイトや書籍で見かけたときは、
この話を参考にして下さい。
さて、C言語の魔法の話が出来る段階まで来ました。
箱は渡すことは出来ないのに、
仕事を依頼した人にその箱の中身を変えてもらうことの出来る不思議な魔法について、
第8講においていよいよ説明しましょう。