2012-11-17 9 views
18

Se ho dichiarato un puntatore p come int *p; nel modulo principale, posso modificare l'indirizzo contenuto da p assegnando p=&a; dove a è un'altra variabile intera già dichiarata. Ora voglio cambiare l'indirizzo utilizzando una funzione come ::Modifica dell'indirizzo contenuto dal puntatore tramite la funzione

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

Se chiamo questa funzione dal modulo principale

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

il contenuto indirizzo è invariato. Cosa c'è di sbagliato nell'usare una funzione per lo stesso compito?

+3

Si passa il puntatore del valore. Se è necessario modificare il puntatore all'interno della funzione, passarlo per riferimento ... doppio puntatore. –

risposta

23

In C, gli argomenti delle funzioni vengono passati per valore. Quindi viene fatta una copia del tuo argomento e la modifica viene apportata a quella copia, non il puntatore effettivo che ti aspetti di vedere modificato. Dovrai modificare la tua funzione per accettare un argomento con doppio puntatore e apportare la modifica all'argomento dereferenziato se vuoi farlo. Per esempio

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 */ 
} 

Se avete il lusso di usare C++ un modo alternativo sarebbe quello di modificare la funzione di accettare un riferimento a un puntatore.

+0

Vorrei solo sottolineare che lo standard C non garantisce che l'assegnazione di p a 0 lo rende nullo. – JKT

0

Questo non cambierà il valore effettivo p perché la q in funzione è locale a quella e cambiamenti in tale funzione non si rifletterà nella main così passare l'indirizzo di p invece di passare p per valore

Uso questa sintassi sotto

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

e chiamare come questo change_adrs(&p);

Oppure, avete altra wa y around: cambia il tipo di restituzione della funzione e cattura l'indirizzo restituito.

9

In C, le variabili vengono passate per valore: una copia del puntatore viene passata alla funzione. Utilizzare un altro puntatore al puntatore invece:

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); 

Questo stampa

*p = 1 
*p = 2 
+0

Questo è stato utile. –

1

Per un tipo di dati di base come ad esempio un int, i doppi puntatori non sono necessari. È possibile scrivere direttamente nell'indirizzo in cui è archiviato lo int, trattando il suo indirizzo come un puntatore nella funzione chiamata. Questo è diverso da un array char ("stringa") in cui la dimensione di ciò che viene indicato è variabile e quindi è necessario utilizzare un altro livello di riferimento indiretto quando lo si cambia da una funzione chiamata. Prova questo:

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

Questa non è una risposta alla domanda !, chiede di cambiare l'indirizzo del puntatore e non il valore del puntatore – Phiber

0

Se si desidera modificare il contenuto di una variabile in una funzione in C, puntatore è una variabile pò così, si deve passare da puntatore o riferimento indiretto utilizzando sempre l'indirizzo & e gli operatori di dereferenziamento *.Intendo l'operatore * viene sempre utilizzato e preceduto quando si modifica il valore di una variabile.

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


void changeIntVal(int *x) { 
    *x = 5; 
} 

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

void changePPAddr(int ***q) { 
    int **dummy; 
    *q = dummy; 
} 

int main() { 
    int *p; 
    int **pp; 
    int *tempForPP; 
    int a = 0; 
    printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a); 


    p = &a; 
    pp = &tempForPP; 
    printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a); 

    changeIntVal(&a);  // ---- 
          // |--- 
    changePointerAddr(&p); // ---- |----> parts of what I mean 
          // |--- 
    changePPAddr(&pp);  // ---- 

    printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a); 

    return 0; 

} 
Problemi correlati