ウォーミングアップ 練習問題2 解答解説

 最大値要素の添字(インデックス)を返す関数 arrayMaxValueIndex を定義する前に,まず,その仕様を書き下しておく

int arrayMaxValueIndex(int array[], int n) の仕様
整数型配列 array の最初の n 個の要素,array[0] から array[n-1] までの中で, 値が最大である要素の添字を戻り値として返す.ただし,最大である要素が複数個あった場合は,それらの添字の最小値を返す.

 この仕様に従って,関数を定義する.

int arrayMaxValueIndex(int array[], int n)
{
    int i, maxi;
    maxi = 0;
    for (i = 1; i < n; i++) {
        if (array[maxi] < array[i]) maxi = i;
    }
    return maxi;
}

 n は配列 array の宣言時のサイズではなく, 実際に使っている(データが入っている)要素の個数であることに注意する. 使用者が誤って n に配列 array のサイズ以上の数値を指定した場合,この関数は正常には動かない.

 この関数の使用例を書いておく.

#include <stdio.h>

int arrayMaxValueIndex(int array[], int n)
{
    int i, maxi;
    maxi = 0;
    for (i = 1; i < n; i++) {
        if (array[maxi] < array[i]) maxi = i;
    }
    return maxi;
}

main()
{
    int a[] = {1, 3, 4, 3, 5, 3, 2, 2};
    printf("%d\n", arrayMaxValueIndex(a, 5));
}
4

 ここで,配列を関数の引数に引き渡したときの注意について述べておく.

 C言語では,関数の呼び出し時に,実引数から仮引数へ,値がコピーされて渡される。ところが,配列を関数の引数に引き渡す場合には,配列全体がコピーされて引き渡されるのではなく,配列の先頭要素を指すポインタのみがコピーされて引き渡たされる. したがって,関数にとってその配列のサイズが何であるかは不明である.
 また,関数内でその引数を用いて参照する配列の要素は,引数として引き渡された,関数の外に実在する配列の要素そのものであり,コピーではない.(もしも関数内で引数を用いて参照する配列の要素を書き換えると,関数の外にある配列の要素が書き 変わる.)

Valid HTML 4.01!