2013-02-07 8 views
5

Dlaczego nie można przypisać punktu do funkcji. Jak zauważyliście w poniższym kodzie. Nie mogę przypisać wskaźnika p1 wskazanego na poprawny adres po powrocie funkcji. Ale dzięki globalnemu wskaźnikowi * p mogę przechowywać informacje o adresie.C Przyporządkowanie wskaźnika w funkcji

#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; 
} 

WYJŚCIE:

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

w C, wszystko jest przekazywana według wartości. Wskaźniki nie są wyjątkiem. –

Odpowiedz

4

Wewnątrz test zmienna pt1 jest niezależnym wskaźnikiem na swoim miejscu. Innymi słowy, jest to , a nie jedynie alias dla p1, ale raczej kopia, która istnieje tylko przez całe życie połączenia.

Tak więc każde zadanie, które do niego wykonujesz, jest tylko wyjściami na czas trwania tego połączenia i nie jest propagowane poza nim. Po powrocie z test przestaje istnieć wskaźnik pt1, a wszelkie zmiany nie są kopiowane z powrotem.

jak również za pomocą dodatkowego „warstwę” wskaźnik jak zrobiłeś z pt2 czasami jest to właściwe wykorzystanie wartości zwracanej do „share” zmienia się z szerszą publicznością:

#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

Dziękuję bardzo. Rozumiem to teraz. – user2052197

1

Ty ARRE minięciu P1 w ujęciu wartościowym, więc zmiany są tylko visable w ramach tej funkcji. przekazać wskaźnik do tego wskaźnika, tak jak w przypadku p2, i wszystko jest w porządku.

#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

Ty przechodząc p1 przez wartość, więc to nie jest aktualizowany w funkcji main. Jednak podajesz p2 przez odniesienie (zauważ, że napisałeś &p2), więc można go zmienić.

+0

Ups, wygląda na to, że 75inchpianista mnie pobił! – William