2016-05-24 5 views
-2

Ich habe einen Code bekommen:Wie übergeben Zeiger auf int, wenn int haben?

void fun1(int ** i) { 
*i = new int(0); 
} 
void fun2(int *& i) { 
    i = new int(69); 
} 
int main() 
{ 
    using namespace std; 
    int a = new int(42); 
    fun1(&a); 
    cout << "fun1" << a << endl; 

    fun2(&a); 
    cout << "fun2" << a << endl; 
} 

Und ich will "a" in Funktionen fun1 und fun2 passieren. Kann ich das tun, ohne einen Zeiger zu erstellen, der auf einen zeigt? Kann ich irgendwie "a" weitergeben?

+0

Nein, soweit mir bekannt ist, haben Sie auf Erstellen Sie in diesen Fällen einen separaten Zeiger auf a. –

+3

Meinten Sie: 'int * a = new int (42);'? –

+0

Sie scheinen ein paar Tippfehler zu haben, aber [das funktioniert für mich] (http://ideone.com/Kjq5Vd). –

Antwort

2

Eine der Funktionen nimmt einen Zeiger auf einen Zeiger:

void fun1(int ** i) 

der andere einen Verweis auf einen Zeiger nimmt:

void fun1(int *& i) 

sie aufrufen, ohne eine Zeigervariable, die ist ziemlich sinnlos, Wie diese Funktionen Haupteffekt (am wahrscheinlichsten) ist, die Adresse zu ändern, auf die der übergebene Zeiger (der als Verweis oder als Verweis übergeben wird) hinweist, so dass er vom Aufrufer verwendet werden kann.

Lässt das funktionieren würde, folgende annehmen

int a; 
fun1(&(&a)); 

Die Funktion würde die Adresse ändern die „vorübergehende“ (&a die ein Zeiger auf int) zeigt auf, aber Sie würden keine Mittel haben, um darauf zuzugreifen.

+0

Sie können '& a' nicht an' fun1' übergeben, weil '& a' kein Zeiger auf einen Zeiger ist, sondern ein Zeiger auf einen int. Diese Zeile wird nicht kompiliert.Am nächsten kommt man, indem man einen Zeiger auf a deklariert und dann die Funktion aufruft: 'int * p = & a; fun1 (&p); 'und es ist immer noch wie du sagst, sinnlos, weil die 'int a;' - Variable nicht mehr angezeigt wird. –

+0

@DavidRector ups du hast Recht, ich werde es bearbeiten – user463035818

+0

Du kannst nicht schreiben & (& a) weil & a ist rvalue – Lassie

0

Um einen Verweis ohne Zeiger haben, tun foo(int &a) {a = 43} gerade und die Funktion wie folgt aufrufen: foo(a)

1

1. aller int a = new int(42); ist falsch der Bediener new auf dem Heap das Objekt erstellt und gibt den Zeiger auf das neu erstellte Objekt . Sie versuchen, es einer int zuzuordnen. Im besten Fall sollte es wie int* a = new int; *a = 42; aussehen, zu welcher Zeit Ihr Code für das Löschen verantwortlich ist.
Nun, wenn Sie eine Funktion wie void func(int* pA) {} haben und eine lokale Variable wie int a = 42; haben und Sie es an Ihre Funktion übergeben möchten, würden Sie Ihre Funktion wie func(&a); aufrufen.
2. beide Funktionen erstellen Speicherleck. Sie erstellen einen neuen Zeiger, der nie gelöscht wird.
3. Wenn Sie den Wert eines in Ihre Funktionen ändern wollen, alles, was Sie brauchen, ist etwas wie folgt aus:

void func1(int* pA) 
{ 
    *pA = 42; 
} 

oder Sie können so etwas tun:

void func2(int& rA) 
    { 
     rA = 42; 
    } 

Ich glaube, Sie haben nicht verstanden die Bedeutung von Zeiger und Referenzen.

0

Operator neue Rückkehrzeiger, so müssen Sie schreiben. Nachdem Sie die Funktionen aufrufen können wie folgt:

fun1(&a); 
fun2(a); 

Und auch nicht vergessen, mit neuen zugewiesenen Speicher zu löschen:

#include <iostream> 
void fun1(int ** i) 
{ 
    delete *i; 
    *i = new int(0); 
} 
void fun2(int *& i) 
{ 
    delete i; 
    i = new int(69); 
} 
int main() 
{ 
    using namespace std; 
    int *a = new int(42); 
    fun1(&a); 
    cout << "fun1: " << a << endl; 
    fun2(a); 
    cout << "fun2: " << a << endl; 
    delete a; 
} 
Verwandte Themen