10.ポインタ

10-5. 関数への配列の渡し方とポインタとの関連

◇関数への配列の渡し方

ここは一旦ポインタから外れて配列と関数になります。
でもポインタのような部分があるので説明します。

▼例1

main()
{
    int i=1,j=2,ans;
    ans=func(i,j);
}

int func(int x,int y)
{
    return (x*y);
}

これは渡した2つ整数の積を求める関数です。(ヘッダー部分は省略しています)
通常変数ならば上のようにして値を渡しますが、配列の場合はどうでしょう。

▼例2

 1:main()
 2:{
 3:    int i[]={1,2};
 4:    int ans;
 5:    ans=func(i[]);
 6:}
 7:
 8:int func(int x[])
 9:{
10:    return (x[0] * x[1]);
11:}

このプログラムは変数を配列に置き換えただけのものです。
ちなみにコンパイルはできません。
まず4行目のi[]で構文エラーになってしまいます。
それと配列は変数を並べたものを指すので、値は複数あります。
とりあえず次の方法でこの場合解決はしますが、配列の長さがわからない場合や配列が長い場合はどうしようもありません。

▼例3

 1:main()
 2:{
 3:    int i[]={1,2};
 4:    int ans;
 5:    ans=func(i[0].i[1]);
 6:}
 7:
 8:int func(int x,int y)
 9:{
10:    return (x,y);
11:}

それでは一般的な配列の渡し方を以下に記述します。

▼例4

 1:main()
 2:{
 3:    int i[]={1,2};
 4:    int ans;
 5:    ans=func(i);
 6:}
 7:
 8:int func(int x[])
 9:{
10:    return (x[0] * x[1]);
11:}

例2にそっくりですがi[]をiとするだけで解決しました。
これは変数の場合の「値渡し」とはちがう事を意味します。
それは次に説明したします。

◇ポインタとの関連

配列の受け渡しにはポインタの働きと密接な関係があります。
ポインタを利用して変数を渡す時は

1.変数のアドレスを渡す
2.そのアドレスをポインタにセットする

という方法になります。これが配列の引渡しと同じということになります。
因みにi[]という配列のアドレスはiになります。
だから引数のi[]をiに変える事でfuncに配列のアドレスが渡されます。

・・・ということは?

▼例5

 1:main()
 2:{
 3:    int i[]={1,2};
 4:    int ans;
 5:    ans=func(i);
 6:}
 7:
 8:int func(int *x)
 9:{
10:    return (*x * *(x+1));
11:}

こんなことができてしまいます。
つまりアドレスで渡されるのならポインタで受けとってみよう
ということです。

ここで *x は配列の先頭の値 i[0]
*(x+1) は配列i[0]の次の要素の値

になるのです。

こうなってくるとポインタで配列が作れるのでは?となってきます。