配列を引数として関数に値で渡すと、最初の要素へのポインターに減衰し、最初の要素が値で渡されます。したがって、関数で受け取るのfunc
は、配列の最初の要素のアドレスのコピーです。関数では、アドレスを変更するだけで、関数の配列は変更されませんmain()
。で何をするにしてもarray
、func()
その関数に対してのみローカルです。これは次のようなものです。
void f(int x)
{
x= 100; //modifying the copy, not the variable in main()
}
int main()
{
int value = 1000;
f(x); //pass by value, means pass a copy!
}
この場合、x
inの値を変更していますf()
。同様に、あなたの場合、あなたはの値を変更していますarray
。はポインタなのでarray
、新しいメモリを割り当てることで、別の場所を指すようにしています。 すべての変更は関数に対してローカルです。
array
また、変数にメモリを割り当て、割り当てを解除しないため、プログラムがメモリをリークすることにも注意してください。これを回避するには、次のように記述する必要があります。
delete [] array;
関数から戻る前。繰り返しますが、これdelete
はで変更array
されませんmain()
。
ちなみに、の配列の要素を変更したい場合はmain()
、代わりにこれを行う必要があります。
void func(int* array)
{
//array=new int[5]; //just comment this
for (int i=5; i>0; i--)
array[5-i]=i; //now array points to the same memory
//where main()'s array is in the memory.
}
お役に立てば幸いです。