2013-02-07 8 views
5

Warum kann ich keinen Punkt in einer Funktion zuweisen? Wie du im folgenden Code bemerkt hast. Ich kann den Zeiger p1, der auf die korrekte Adresse nach der Rückgabe der Funktion zeigt, nicht zuweisen. Aber mit dem globalen Zeiger * p kann ich die Adressinformation speichern.C Zeigerzuordnung in einer Funktion

#include <stdio.h> 
#include <stdlib.h> 

int *p = NULL; 
void test(int * pt1, int**pt2){ 
    p = (int*)malloc(sizeof(int));  
    pt1 = p; 
    *pt2 = p; 
    printf("p points to %p\n", p); 
    printf("pt1 points to %p\n", pt1); 
    printf("pt2 points to %p\n", *pt2); 
} 

int main(void) { 
    int *p1 = NULL; 
    int *p2 = NULL; 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    test(p1, &p2); 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    return 0; 
} 

OUTPUT:

p points to (nil) 
p1 points to (nil) 
p2 points to (nil) 
p points to 0x8acb008 
pt1 points to 0x8acb008 
pt2 points to 0x8acb008 
p points to 0x8acb008 
p1 points to (nil) 
p2 points to 0x8acb008 
+0

In C, alles übergeben wird nach Wert. Pointer ist keine Ausnahme. –

Antwort

4

Innerhalb test ist die Variable pt1 ein eigenständiger Zeiger. Das heißt, es ist nicht nur ein Alias ​​für p1, sondern eine Kopie, die nur für die Lebensdauer des Anrufs existiert.

Also jede Zuweisung, die Sie zu ihm machen, ist nur Ausgänge für die Dauer dieses Aufrufs und wird nicht außerhalb davon verbreitet. Wenn Sie von test zurückkehren, hört der Zeiger pt1 auf zu existieren, und alle Änderungen werden nicht zurück kopiert.

Neben der Verwendung einer zusätzliche „Schicht“ des Zeigers wie hast du mit pt2 manchmal ist es angebracht, den Rückgabewert zu verwenden, um „Share“ Änderungen mit einem breiteren Publikum:

#include <stdio.h> 
#include <stdlib.h> 

int *p = NULL; 
int *test(int * pt1, int**pt2){ 
    p = (int*)malloc(sizeof(int));  
    pt1 = p; 
    *pt2 = p; 
    printf("p points to %p\n", p); 
    printf("pt1 points to %p\n", pt1); 
    printf("pt2 points to %p\n", *pt2); 
    return pt1; 
} 

int main(void) { 
    int *p1 = NULL; 
    int *p2 = NULL; 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    p1=test(p1, &p2); 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    return 0; 
} 
+0

Vielen Dank. Ich verstehe es jetzt. – user2052197

1

Sie arre von Wert in den p1 vorbei, so dass die Änderungen sind nur sichtbar im Rahmen dieser Funktion. übergeben Sie einen Zeiger auf diesen Zeiger, wie Sie mit P2 getan haben, und Sie sind in Ordnung.

#include <stdio.h> 
#include <stdlib.h> 

int *p = NULL; 
void test(int **pt1, int**pt2){ 
    p = (int*)malloc(sizeof(int));  
    *pt1 = p; 
    *pt2 = p; 
    printf("p points to %p\n", p); 
    printf("pt1 points to %p\n", pt1); 
    printf("pt2 points to %p\n", *pt2); 
} 

int main(void) { 
    int *p1 = NULL; 
    int *p2 = NULL; 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    test(&p1, &p2); 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    return 0; 
} 
1

Sie vorbei p1 nach Wert, so dass es nicht in der main Funktion aktualisiert. Sie übergeben jedoch p2 durch Verweis (beachten Sie, dass Sie &p2 geschrieben haben), so dass es geändert werden kann.

+0

Ups, sieht aus wie 75 Zollpianist mich dazu schlagen! – William

Verwandte Themen