2012-04-07 4 views
0

Ich schreibe eine Funktion, die die Zeigerwerte vom Anrufer angezeigt. Weil ich nicht das Original ** arr1 vermasseln will, also habe ich ihm ein ** P zugewiesen, dann drucke ich es aus und zähle es. Aber dann die linke Seite, die arr1 ist, wird Null.Nach dem Zuweisen eines Zeigers zu einem Zeiger, warum der Lvalue Null werden

Code:

void merge(int **arr1, int **arr2, int **arr3) 
    { 
    int **p1= arr1; 
    int **p2= arr2; 
    int **p3= arr3; 

    int count; 

    printf("%d\n", **arr1); //this shows the correct value of first element of arr1 

    while(**p1) 
    { 
    printf("%d\n", **p1); 
    (*p1)++; 
    count++; 
    } 

    while(**p2) 
    { 
    printf("%d\n", **p2); 
    (*p2)++; 
    count++; 
    } 

    printf("%d\n", **arr1); // this become zero, why??i didn't touch it in my code didn't i? 
    } 

Antwort

2

Da arr1 und p1 auf die gleiche Sache. Wenn Sie also *p1 ändern, ändern Sie auch *arr1, weil sie das gleiche Objekt sind.

+0

Sie richtig sind, aber Ich habe nicht geändert ** p1 habe ich nicht? –

+0

@qwrqwr: Du hast '* p1' modifiziert, also zeigt es jetzt woanders hin. Also wird '** p1' jetzt ein anderes Objekt sein. Am besten ist es, dies auf Papier zu zeichnen. –

+0

Wenn ich (* p) ++ mache, gehe ich einfach auf den Zeiger zum nächsten Wert von ** p1, nicht wahr? Und die Adresse von ** arr1 ändert sich während dieser Änderung nicht. also wenn ich ** arr1 drucke, ist es immer noch auf dem ersten Element von arr1 –

2

Wie Sie gesagt haben, **p1 und **arr1 ist der gleiche Wert int, auf den hingewiesen wird.

Jetzt haben Sie die Schleife while(**p1), so um die Schleife und erhalten bis auf die printf Anweisung zu beenden, **p1 0.

Innerhalb dieser Schleife betragen muss, p1 wird nie geändert werden *p1 ist, das ist, daher die gleiche wie *arr1, sobald die Schleife verlassen hat, p1 und arr1 weisen noch auf die gleiche Position und **p1 wird gleich 0. daher **arr1 den gleichen Wert wie **p1 betragen muss, das ist 0.

+0

Danke! Also gibt es sowieso, um es wie zu behandeln, p1 Punkt zu arr1 und die Änderung von p1 wird nicht Auswirkungen arr1? –

+0

@qwrqwr: Wenn Sie den Wert von 'p1' ändern, wirkt sich das nicht auf 'arr1' aus, aber Sie tun das nie in Ihrem obigen Code. dh. 'p1 ++', 'p1 = NULL',' p1' ändern und keinen Wert ändern, den Sie von Dereferenzierung 'p1' erhalten, hat keinen Einfluss auf' arr1'. Wenn diese an die Funktion übergebenen Arrays vom Typ int [] und nicht von int [] [] sind, benötigen Sie nur einen einzigen Zeiger, keinen doppelten. – AusCBloke

+0

Das Problem ist, dass meine Funktion einen Zeiger nimmt, der auf einen Zeiger zeigt, warum ich ein ** brauche –

Verwandte Themen