関数に配列を渡す

いやー基本ですが、使わないと忘れてしまいますね。
っていうか、PHPとか何でも渡せすぎなんだよ!


C系の言語で関数に配列を渡す方法です。

関数には単純な変数しか渡せない

C系の言語は関数に単純な変数しか渡せません。
配列が渡せないのです。


じゃあどうするか。そうです、ポインタを渡します。
構造体はメモリ領域の節約だったり、そっちんが楽っていう
意味でポインタを渡しますが、配列の場合は単純に渡せないから
です。

配列名は配列の開始アドレス

例えば、

int a[10];

こんな風に宣言した配列へのポインタは

a

になります。このaには配列aの先頭のアドレスが入っています。
つまり、

int a[10];

a == *(a[0]);

ということです。

配列の要素にアクセスするにはアドレスを演算する

後は関数に渡すだけです。こんな感じです。

void main() {
  int a[10];
  calcSum(a, 10);
}

void calcSum(int *dat, int num) {
  int i, sum;
  for(i = 0; i < num; i++) {
    sum += *(dat + i);
  }
  printf("SUM = %d", sum);
}

まずは関数にポインタを渡す部分。これは単純に配列名を
渡しているだけです。


そしてcalcSum内でdat内を参照している部分。
渡されるのはポインタなので、ポインタをインクリメントすれば
その分だけ参照される変数が移動します。
こんな風にしてデータを参照します。


ただこの書き方は微妙にわかりにくいので、本当はインデックス
サフィックスによる参照)ができるといいんですが、
どうやってやったっけなーって感じです。
ま、アクセスできているのでいいのですが。


ポインタ(pointer)
http://www.cc.kyoto-su.ac.jp/~yamada/programming/pointer.html