2012-11-17 7 views
18

Jeśli zadeklarowałem wskaźnik p jako int *p; w głównym module mogę zmienić adres zawarty w p, przypisując p=&a; gdzie a jest już zadeklarowaną inną zmienną całkowitą. Teraz chcę zmienić adres za pomocą funkcji jako ::Zmiana adresu zawartego przez wskaźnik przy użyciu funkcji

void change_adrs(int*q) 
{ 
    int *newad; 
    q=newad; 
} 

Jeśli zgłoszę tej funkcji z modułu głównego

int main() 
{ 
    int *p; 
    int a=0; 
    p=&a; // this changes the address contained by pointer p 
    printf("\n The address is %u ",p); 
    change_adrs(p); 
    printf("\n the address is %u ",p); // but this doesn't change the address 
    return 0; 
} 

zawartość adres jest niezmieniona. Co jest złego w korzystaniu z funkcji dla tego samego zadania?

+3

Przez wskaźnik podajesz wskaźnik. Jeśli chcesz zmienić wskaźnik w funkcji, podaj go przez odniesienie ... podwójną wskazówkę. –

Odpowiedz

23

W języku C argumenty funkcji są przekazywane według wartości. Tak więc tworzona jest kopia twojego argumentu i zmiana jest dokonywana na tej kopii, a nie faktyczny wskaźnik, który spodziewasz się zmodyfikować. Będziesz musiał zmienić swoją funkcję, aby zaakceptować argument podwójnego wskaźnika i wprowadzić zmianę do argumentu dereferencji, jeśli chcesz to zrobić. Na przykład

void foo(int** p) { 
     *p = 0; /* set pointer to null */ 
} 
void foo2(int* p) { 
     p = 0; /* makes copy of p and copy is set to null*/ 
} 

int main() { 
    int* k; 
    foo2(k); /* k unchanged */ 
    foo(&k); /* NOW k == 0 */ 
} 

Jeśli masz luksus za pomocą C++ alternatywny sposób byłoby zmienić funkcję przyjąć odniesienie do wskaźnika.

+0

Chciałbym tylko zwrócić uwagę, że standard C nie gwarantuje, że przypisanie p do 0 powoduje, że jest on pusty. – JKT

0

ta nie ulegnie zmianie wartość rzeczywistą p ponieważ q funkcja jest lokalny i że zmiana tej funkcji nie będzie odzwierciedlać w main więc przekazać adres p zamiast przechodzenia p wartością

użytku ta składnia poniżej

void change_adrs(int **q) 
    { 
    int * otheraddess; 
    *q = otheraddress; 
    } 

i nazywają się ten change_adrs(&p);

Albo masz inne wa y około: zmienić typ zwrotu funkcji i złap zwrócony adres.

int* change_adrs(int *q) 
     { 
     int * otheraddess; 
     q = otheraddress; 
     return q; 
     } 


int main() 
{ 
p=change_adrs(p); 
return 0; 
} 
9

W języku C zmienne są przekazywane wartością - kopia wskaźnika jest przekazywana do funkcji. Użyj innego wskaźnika do wskaźnika zamiast:

void change(int **p, int *someOtherAddress) 
{ 
    *p = someOtherAddress; 
} 

int a = 1, b = 2; 
int *p = &a; 

printf("*p = %d\n", *p); 
change(&p, &b); 
printf("*p = %d\n", *p); 

Drukuje

*p = 1 
*p = 2 
+0

To było pomocne. –

1

Dla prymitywnego typu danych, takich jak int, podwójne wskaźniki nie są konieczne. Możesz pisać bezpośrednio w adresie, w którym przechowywany jest int, traktując jego adres jako wskaźnik w wywołanej funkcji. Jest to niepodobne do tablicy char ("string"), w której wielkość wskazanego obiektu jest zmienna i dlatego należy zmieniać poziom z poziomu wywoływanej funkcji na inny poziom. Spróbuj tego:

void foo(int *oldVal) 
{ 
    int newVal = 99; // or whatever you want 
    *oldVal = newVal; 
} 

int main(int argc, char *argv[]) 
{ 
    int someVal = 0; 
    foo(&someVal);  // we send its address to foo() 

    printf("someVal is now %d.\n", someVal); 

    return EXIT_SUCCESS; 
} 
+0

To nie jest odpowiedź na pytanie!, Prosi o zmianę adresu wskaźnika, a nie wskaźnika – Phiber

0

Jeśli chcesz zmienić zawartość zmiennej w funkcji w C, wskaźnik jest zmienną trochę jak dobrze, trzeba przekazać go przez wskaźnik lub pośrednim odniesieniem przy użyciu zawsze & adres i * operatorów dereferencyjnych.Mam na myśli operatora *, który zawsze jest używany i poprzedza go przy zmianie wartości zmiennej.