Quando si pensa ai puntatori, è necessario essere chiari su alcune astrazioni.
Un oggetto in memoria. Questo può essere di qualsiasi tipo (e dimensione). Un oggetto intero, ad esempio, occuperà 4 byte in memoria (su macchine a 32 bit). Un oggetto puntatore occuperà 4 byte in memoria (su macchine a 32 bit). Come dovrebbe essere ovvio, l'oggetto intero contiene valori interi; un oggetto puntatore contiene indirizzi di altri oggetti.
Il linguaggio di programmazione C consente ai simboli (variabili) di rappresentare questi oggetti nella memoria. Quando si dichiara,
int i;
il simbolo (variabile) i rappresenta un intero oggetto in memoria. Più specificamente, rappresenta il valore di questo oggetto. Puoi manipolare questo valore usando i nel programma.
& ti darò l'indirizzo di questo oggetto in memoria.
Un oggetto puntatore può contenere l'indirizzo di un altro oggetto. Si dichiara un oggetto puntatore usando la sintassi,
int * ptr;
Proprio come altre variabili, la variabile puntatore rappresenta il valore di un oggetto, un oggetto puntatore. Questo valore sembra essere un indirizzo di qualche altro oggetto. Imposta il valore di un oggetto puntatore in questo modo,
ptr = & i;
Ora, quando si dice ptr nel programma, ci si riferisce al suo valore, che è l'indirizzo di i. Ma se si dice * ptr, ci si riferisce non al valore di ptr, ma piuttosto al valore dell'oggetto il cui indirizzo è in ptr i.e. i.
Il problema con la funzione di scambio è che si stanno scambiando i valori dei puntatori, non i valori degli oggetti per cui questi puntatori contengono gli indirizzi. Per ottenere i valori degli oggetti, dovresti usare * ptr.
La domanda ovvia sarebbe, qual è la differenza tra questa implementazione e l'implementazione che funziona? (So qual è il problema con questo, sto solo cercando di aiutarti a trovarlo.) [Naturalmente, tutti i bramosi desiderosi di SO sono tutti disposti a saltare direttamente alla risposta.] –
Una solida lezione di crash su passare in base al valore. Grazie ppl. –