Posted at

ポインタについて

More than 1 year has passed since last update.


概要

ポインタはアドレスだといわれてもピンとこない人が多いみたいなんで書きました。かなりの人が難しく感じるようです。(ぼく自身もあんまり理解していないので鵜呑みにしないでくださいね。)


ポインタを使う関数

実は、ポインタを使う関数はかなり身近なところにあります。scanfの二つ目以降の引数の前には&が付きますよね。(scanf("%d%d", &i, &j);のような感じで)。この変数の前の&は変数のポインタという意味です。ほかにも、&を変数の前につける関数をみつけてみてください。意外とあるものです。


関数の値渡し

次の例を見てみましょう

#include <stdio.h>

int incl(int x);

int main(){
int i = 0;
printf("%d\n", i); // 当然0
printf("%d\n", incl(i)); // これも、当然1
printf("%d\n", i); // 実はこれは0
return 0;
}

int incl(int x){
x++;
return x;
}

実は、関数を呼び出すときに変数iのコピーを作ってから関数内の処理を実行するので、main関数の中のiに影響を与えることはありません。では次の例を見てみましょう。

#include <stdio.h>

int incl(int *x);

int main(){
int i = 0;
printf("%d\n", i); // 0
printf("%d\n", incl(&i)); // 1
printf("%d\n", i); // 今度はこれは1になる。
return 0;
}

int incl(int *x){
(*x)++;
return *x;
}

コンピュータ上のどこかにiという変数を管理している場所があるはずですよね。この場所を示したものをiのポインタと呼んだりします。人によってはこれのことをiの住所なんて言う表現をしたりしますね。この変数iのアドレス(住所)をC++だと&iと書きます。関数の引数に*がついていますね。これは変数がポインタだということを示しています。

ところで、このプログラムの実行結果に注目してほしいのですが、3行目の出力が1になってますね。これは、main関数のiとincl関数のxのアドレスが一致しているからです。そのためincl関数の中で値を変更すればmain関数に影響を与えることはわかるでしょう。