2016-03-29 11 views
-1

Wie übergibt man ein Zeiger-Array an eine Funktion als Referenz? Ich übergebe ein dynamisches Array an eine Funktion, die innerhalb der Funktion korrekt funktioniert, aber ich bin nicht in der Lage, das Zeigerarray als Referenz zu übergeben. Ich weiß, dass Array standardmäßig als Verweis übergeben wird. DankWie übergibt man ein Zeiger-Array an eine Funktion als Referenz?

#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

Da Sie wissen, dass ein Array standardmäßig per Referenz übergeben wird, verstehe ich nicht, was Sie vielleicht fragen. Was möchten Sie * stattdessen * tun, um ein Array als Referenz zu übergeben? – wallyk

+0

Sie möchten einen Zeiger als Referenz übergeben. Übergeben Sie den Zeiger als Referenz. 'int * & arr' – user4581301

+0

Sie können [' std :: vector '] (http://en.cppreference.com/w/cpp/container/vector) anstelle von Arrays und deren Größen verwenden. Verwenden Sie ['push_back'] (http://en.cppreference.com/w/cpp/container/vector/push_back), um Daten zu einem' Vektor' hinzuzufügen. – anatolyg

Antwort

2

, wenn Sie anrufen int *arr = new int[SIZE]; Sie Speicher zugewiesen haben zu speichern SIZE von int und arr auf diesen Speicher zeigt.

Inside addData Funktion rufen Sie arr = new int[SIZE+1]; erwartet arr, jetzt auf einen Speicher mit neuen Werten gefüllt zu sein, wenn die Funktion zurückgibt. Wenn jedoch an void addData(int *arr, int &SIZE, int data) übergeben wird, wird kopiert. Die Zeigervariable arr hat denselben Wert wie eine äußere Variable, verweist jedoch auf verschiedene Stellen. Nach arr = new int[SIZE+1]; zeigt die innere Variable nicht mehr auf dieselbe Stelle wie eine äußere.

Wenn Sie printArray anrufen, wird Ihr äußerer arr den gleichen Müll haben, den Sie hatten, als Sie int *arr = new int[SIZE]; angerufen haben.

Sie können arr Argument durch Referenz wie void addData(int* &arr, int &SIZE, int data) akzeptieren, um das Problem zu beheben. Dies stellt sicher, dass die innere Variable an der gleichen Stelle gespeichert wird wie eine äußere Variable, die sich ändert.

Sie könnten verwirrt sein über die Tatsache, dass Sie tatsächlich einen Zeiger übergeben und keine Änderungspersistenz beobachten. Die Änderungen werden tatsächlich für die Array-Elemente beibehalten. Wenn Sie beispielsweise arr[0] = 2 in die Funktion schreiben, werden diese Änderungen nach dem Ende der Funktion angezeigt. Aber Änderungen mit der Zeigervariablen selbst werden nicht beibehalten.

+0

Vielen Dank. Ich habe die Lösung. –

0

Funktion Header sollte

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

Richtige Idee. Vielleicht möchten Sie die '*' und '&' obwohl – user4581301

Verwandte Themen