void numeric(int m)
{
m = 0;
}
は、次のコードスニペット
void numeric(int *m_ptr)
{
*m_ptr = 0;
}
//...
int m = 1;
numeric(&m);
を検討してください。
今度は、配列
int m[1] = 1;
numeric(&m[0]);
そして、この場合にはオブジェクトm[0]
は、関数内で変更されますと同じ機能を使ってみましょう。配列型を有するとして宣言されたパラメータをポインタに調整されているので、ここでこの機能
void numeric(int *m_ptr)
{
*m_ptr = 0;
}
が
void numeric(int m_ptr[])
{
*m_ptr = 0;
}
のように書き換えることができる
。例えば、これらの関数宣言は
void numeric(int m_ptr[1]);
void numeric(int m_ptr[10]);
void numeric(int m_ptr[100]);
void numeric(int m_ptr[]);
は互いに等価であり、今度は関数宣言
void numeric(int *m_ptr);
と同様の機能を宣言に相当します。これらすべての宣言を1つのコンパイル単位に含めることができます。
一方、関数に渡された配列は、最初の要素へのポインタに暗黙的に変換されます。そう
numeric(&m[0]);
上記の関数の呼び出しは、このように、配列をパラメータとして、それに応じて要素が渡さので、その要素を変化させることができる引数として使用されるコール
numeric(m);
と等価です参照によって機能する。上記の最初のコードスニペットの例に示されているように、単一のオブジェクトを参照渡しする場合は、そのオブジェクトも変更されます。
したがって、関数が引数を参照または値で受け入れるかどうかは異なります。配列が使用される場合、それらの要素は実際には参照によって関数に渡されるため、関数内で変更することができます。
配列要素を変更するときには、配列変数自体を変更しないでください。 – neoaggelos
コードをインデントしてください。 –
必要な方法で助けを得るために完全なコードを共有してください:) –