2016-03-29 15 views
-1

ポインタ配列を参照渡しとして関数に渡すにはどうすればよいですか? 関数内で正しく機能している関数に動的配列を渡していますが、参照渡しとしてポインタ配列を渡すことができません。 配列が参照渡しとしてデフォルトで渡されることはわかっています。あなたはintarrSIZEは、このメモリを指している保存するためのメモリを割り当てたint *arr = new int[SIZE];呼び出すと おかげポインタ配列を関数に渡して参照渡しする方法はありますか?

#include <iostream> 

using namespace std; 

void printArray(int *arr, int SIZE){ 
    for (int i = 0; i < SIZE; i++) 
     cout << arr[i] << ' '; 
    cout << endl; 
} 
void addData(int *arr, int &SIZE, int data){ 
    int *temp = new int[SIZE]; 
    for (int i = 0; i < SIZE; i++){ 
     arr[i] = i; 
     temp[i] = arr[i]; 
    } 
    printArray(temp, SIZE); //Output is: 0 1 2 3 4 
    printArray(arr, SIZE); //Output is: 0 1 2 3 4 
    delete arr; 
    arr = NULL; 

    arr = new int[SIZE+1]; 
    for (int i = 0; i < SIZE; i++) 
     arr[i] = temp[i]; 
    arr[SIZE] = data; 
    SIZE++; 
    printArray(arr, SIZE); //Output is: 0 1 2 3 4 5 
    delete temp; 
    temp = NULL; 
} 
int main(){ 
    int SIZE = 5; 
    int *arr = new int[SIZE]; 
    addData(arr, SIZE, 5); //Extend the array by one index to insert data 
    printArray(arr, SIZE); //Output is: Some garbage values but Output should be: 0 1 2 3 4 5 

    cout << endl; 
    system("PAUSE"); 
    return 0; 
} 

Output

+1

配列はデフォルトで参照渡しされることがわかっているので、私はあなたが何を求めているのか理解していません。配列を参照渡しする代わりに*何をしたいですか? – wallyk

+0

参照によってポインタを渡したいとします。ポインタを参照渡しします。 'int *&arr' – user4581301

+0

配列とそのサイズの代わりに[' std :: vector '](http://en.cppreference.com/w/cpp/container/vector)を使うことができます。 '' push_back''(http://en.cppreference.com/w/cpp/container/vector/push_back)を使って 'vector'にデータを追加してください。 – anatolyg

答えて

2

でなければなりません。

addDataの内部にある関数は、arrが、関数が戻るときに新しい値で埋められたメモリを指していると予想します。しかしint *arrvoid addData(int *arr, int &SIZE, int data)に渡された場合、がコピーされます。ポインタ変数arrは外部変数と同じ値を持ちますが、別の場所を参照しています。 arr = new int[SIZE+1];の後、内部変数はもはや外側の変数と同じ場所を指していません。

printArrayに電話をすると、と同じ生ごみになります。arrint *arr = new int[SIZE];と同じです。

あなたは問題を解決するためにvoid addData(int* &arr, int &SIZE, int data)などの参照によってarr引数を受け入れることができます。これは内部変数が変更を永続させる外部変数と同じ場所に格納されることを保証します。

あなたが実際にポインタを渡し、何も変更の永続性を観察していないという事実について混同される可能性があります。変更は実際には配列要素に対して保持されます。たとえば、関数にarr[0] = 2を書き込むと、関数の終了後に変更が存在します。しかし、ポインタ変数自体の変更は永続化されません。

+0

ありがとう、ありがとうございます。 私は解決策を得ました。 –

0

機能ヘッダは

void addData(int &*arr, int &SIZE, int data) 
+0

良いアイデア。 – user4581301

関連する問題