配列の復習

型 変数名[要素数] = {初期化列};
// {初期化列}は省略してよいが、その場合は初期値不定になるよ
 
float farray[5] = {1.0, 2.0 ,3.0 ,4.0, 5.0};

宣言された配列は、メモリ上で必ず連続して並ぶ(変数のアドレスが連続している)
また、[]演算子を用いることによって、配列の先頭から番号を付けて要素にアクセスすることができる。

float farray[5] = {1.0, 2.0 ,3.0 ,4.0, 5.0};
farray[0] ~ farray[4]ができる

farray[0]:1.0
farray[1]:2.0
farray[2]:3.0
farray[3]:4.0
farray[4]:5.0

farray[0], farray[1], farray[2], farray[3], farray[4]それぞれは、普通に宣言した変数と同じで特に何の変哲もない

float a=1.0, b=2.0, c=3.0, d=4.0, e=5.0;
float farray[5] = {1.0, 2.0 ,3.0 ,4.0, 5.0};

添え字でアクセスできること以外は、a,b…で宣言した変数と「性質は何も変わらない」よ。

floatの引数を2個とって、その和を返す関数を作ります。

//floatの値を2つ足して返す関数
float fadd(float _a, float _b)//_a, _bは仮引数
{
	return(_a + _b);
}

これは、特に説明いらないよね。
mainでこの関数を使うには、

//プロトタイプ宣言
//floatの引数を2個とって、その和を返す関数
float fadd(float _a, float _b);
 
int main()
{
    float a=12.3, b=3.14;//実引数として渡す値
    float c;  //返す値を生成する、作業用の変数
 
    c = fadd(a, b); //a,b 実引数
    c = fadd(12.3, 3.14); //実引数は、値に置き換わり、仮引数にコピーされる
    c = 15.44;  15.44<=fadd(12.3, 3.14) 15.44を返してるので
    rerturn 0;
}

参考:値渡しと参照渡し

上で書いたように、配列の個々の要素farray[2], farray[4]などは、float a,b;のように宣言された変数と何ら変わりはありません。
なので、実引数として関数に渡すのは簡単です。

c = fadd(farray[2], farray[4]);
//c = fadd(3.0, 5.0); farray[2],farray[4]が値に置き換わり、仮引数に値がコピーされる

これは、特に問題なくできると思います。
プログラムを作ってるとやりたくなるのが、配列の全要素を関数内で参照するってやつ

たとえば、「5個の要素を持つ配列farrayの和を返す関数を作りたいなぁ」とか。
何度か説明している通り、関数に、「引数を使って、配列全体を渡す」というエキセントリックなことはできません
じゃあどうしますか?

//全部は渡せないから、こうする?
float sumf(float _a,float _b,float _c,float _d,float _e){省略}
float sum = sumf(farray[0],farray[1],farray[2],farray[3],farray[4]);

こんな関数作りますか?
要素数5個ぐらいだといいけど、100個とか200個とか要素あったらすごいことになるよね。。。

  • 引数経由では、配列全体を関数に渡すことはできない
  • 代わりの策として、配列の先頭のアドレスを渡して、添え字でアクセスすることで全体にアクセスできる
  • ただし、配列がどこまで続いているかは、アドレスだけからはわからないので、配列数も一緒に渡す必要がある
  • 難しいから、パターン学習で覚えちゃってもいいと思う。

例)

//宣言と定義では普通にに配列だよということで書ける
float sumf(float _array[], int _size)
{
    float _sum = 0.0;
    for(int i=0; i< _size; i++)
    {
        _sum = _sum + _array[i];
    }
    return(_sum);
}

使うときは、こんな感じ

int main()
{
    float farray[5] = {1.0, 2.0 ,3.0 ,4.0, 5.0};
    float sum;
    //配列名と配列数を指定する
    sum = sumf(farray, 5);
}
  • game-engineer/classes/2022/game-programing-1/first-term/7/7-21-1.txt
  • 最終更新: 4年前
  • by root