2016-10-04 3 views
1

私はC++を学ぶために非常に簡単なコードを作った。そして私は、スタック上に作成された配列を別の関数に送ると、関数がソース配列を変更するという発見をしました。これは他の変数とは異なります。 intや何かのように。値として配列をパラメータとして送信しますか?

なぜそれはそうですか?

コード:

void ByValue(int arr[], int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     arr[i] += 1; 
    } 
} 

void SimpleArray() 
{ 
    int arr[3]; 

    for (int i = 0; i < 3; i++) 
    { 
     arr[i] = i+1; 
     cout << "Element [" << i << "] is " << arr[i] << endl; 
    } 
    cout << endl; 
    ByValue(arr, 3);// <-- should be by value 
    for (int i = 0; i < 3; i++) 
    { 
     cout << "Element after change [" << i << "] is " << arr[i] << endl; // <-- this shouldent change ? 
    } 
    cout << endl; 

} 

出力を与える:それは値によって渡された場合

Element [0] is 1 
Element [1] is 2 
Element [2] is 3 

Element after change [0] is 2 
Element after change [1] is 3 
Element after change [2] is 4 

第2の出力は 、最初と同じでなければならないが、今私が使用みたいですポインタ?

+1

値によってアレイを渡すために 'std :: array'を使用してください –

答えて

4

事実、ByValueのプロトタイプ、すなわち配列がポインタ型にを減衰した

void ByValue(int* arr, int size)

あります。したがって、配列の変更はが呼び出し側に反映されます。

表記*(arr + n)と同じからarr[n]であることに注意してください。

+0

注:パラメータはポインタに調整されています。引数*はポインタがポインタであるため、減衰します。 – juanchopanza

+0

しかし、配列はまだスタックに残っていますか?だからbyValueのponiterがスタックを指していますか? – Niklas

+1

アレイには自動保存期間があります。ポインタもこれらの型を指すことができます。 – Bathsheba

1

配列を関数に渡すと、それをポインタに減衰させます。実際には元の配列に変更が加えられています。 arrは配列内の最初の要素のアドレスにすぎません。そのアドレスが関数に渡されています。だから、関数の中で、あなたはそれがarrとしてあなたの元の配列の変化は、元の配列の最初の要素のアドレスと同じアドレスであることを確認します*(arr + index) = value;のように分類されて

arr[index] = value;

、 をすれば。

関連する問題