C言語で関数に配列を渡す方法。ポインタとの関係も解説。
// 2通りの書き方。どちらも同じ意味 int sumArray(int a[], int n) { ... } int sumArray(int *a, int n) { ... } int main(void) { int scores[5] = {80,65,92,78,88}; int total = sumArray(scores, 5); // 配列名だけで渡す(&不要) printf("%d\n", total); } int sumArray(int a[], int n) { int s = 0; for(int i=0; i<n; i++) s += a[i]; return s; }
void reset(int a[], int n) { for(int i=0; i<n; i++) a[i] = 0; // 呼び出し元の配列も0になる } int main(void) { int x[3] = {1,2,3}; reset(x, 3); printf("%d %d %d\n", x[0], x[1], x[2]); // → 0 0 0 }
sizeof(a) は使えない! 関数内では配列は「アドレス」として渡されているため、sizeofはポインタのサイズ(8バイトなど)しか返しません。int main(void) { int a[5]; printf("%ld\n", sizeof(a)); // 20 (5要素×4バイト) test(a); } void test(int a[]) { printf("%ld\n", sizeof(a)); // 8 (ポインタのサイズ)! }
この講座の理解度をチェックしましょう!
C言語では配列名は先頭要素のポインタとして解釈されるため、関数にはアドレスが渡されます。
ポインタ渡しなので、関数内で配列の要素を変更すると呼び出し元の配列も変更されます。
関数に渡されるのはポインタだけなので、sizeof では元の配列サイズがわかりません。要素数は別の引数で渡す必要があります。