ポインタというのは、メモリ上に確保された領域を指しているアドレスを格納する変数です。
よって、ポインタの中身には変数の実体が入っているのではなく、変数の実体があるメモリ上の場所が入っていることになります。
そして、関数の引数にポインタを指定すると何ができるのかというと、関数の外にある変数の中身を書き換えることができるようになります。
この【関数の外にある変数の中身を書き換えることができるようになる】というのは、非常に便利な仕様です。
例えば、とある変数の中身の値を2倍の数値に書き換える関数を作りたいとします。
ポインタを使わず以下のように書いても、Double( )関数の中でしか変数valは生存できないので実際に表示される値は変わらず1のままです。
lang
1#include <stdio.h>
2
3void Double( int val )
4{
5 val *= 2;
6
7 printf( "val : %d\n", val );
8}
9
10int main( )
11{
12 int a = 1;
13
14 printf( "a : %d\n", a );
15
16 Double( a );
17
18 printf( "a : %d\n", a );
19
20 return 0;
21}
■実行結果
a : 1
val : 2
a : 1
しかし、ポインタを使って以下のように書くと表示される値は2になります。
lang
1#include <stdio.h>
2
3void Double( int* val )
4{
5 *val *= 2;
6
7 printf( "val : %d\n", val );
8}
9
10int main( )
11{
12 int a = 1;
13
14 printf( "a : %d\n", a );
15
16 Double( &a );
17
18 printf( "a : %d\n", a );
19
20 return 0;
21}
■実行結果
a : 1
val : 2
a : 2
また、ポインタはほかにも特性(※)を持っていて、配列を渡すことも可能です。
(※)正確には同じ特性なのですが、わかりやすいかなと思ったので別の特性として扱っています。
lang
1#include<stdio.h>
2
3void SetVal( int* Array )
4{
5 Array[ 0 ] = 1;
6 Array[ 1 ] = 2;
7 Array[ 2 ] = 3;
8}
9
10int main( )
11{
12 int Array[ 3 ] = { 0 };
13
14 printf( "Array[ 0 ] : %d\n", Array[ 0 ] );
15 printf( "Array[ 1 ] : %d\n", Array[ 1 ] );
16 printf( "Array[ 2 ] : %d\n\n", Array[ 2 ] );
17
18 SetVal( Array );
19
20 printf( "Array[ 0 ] : %d\n", Array[ 0 ] );
21 printf( "Array[ 1 ] : %d\n", Array[ 1 ] );
22 printf( "Array[ 2 ] : %d\n\n", Array[ 2 ] );
23
24 return 0;
25}
■実行結果
Array[ 0 ] : 0
Array[ 1 ] : 0
Array[ 2 ] : 0
Array[ 0 ] : 1
Array[ 1 ] : 2
Array[ 2 ] : 3
プログラムが大きくなっていくにつれて、自然とプログラムの中身を細かく分けていくことになると思います。
いくつかの変数をまとめて扱うようにしたり、とある関数の中のとある処理がほかの関数でも使いたくなった時に新しい関数として使うようになった時。
そんな時、ポインタはとても役に立ちます!
長文失礼しました。
勉強頑張ってください!
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/01/06 05:57