2010-10-01 2 views
10

Sono nuovo di C e sto ancora cercando di cogliere il concetto di puntatori. So come scrivere una funzione di scambio che funziona ... Sono più preoccupato del motivo per cui questo particolare non lo fa.Semplice funzione di scambio ... perché questo non scambia?

void swap(int* a, int* b) 
{ 
int* temp = a; 
a = b; 
b = temp; 
} 

int main() 
{ 
int x = 5, y = 10; 
int *a = &x, *b = &y; 
swap(a, b); 
printf(“%d %d\n”), *a, *b); 
} 
+5

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.] –

+1

Una solida lezione di crash su passare in base al valore. Grazie ppl. –

risposta

29

Manca * s nella funzione di scambio. Prova:

void swap(int* a, int* b) 
{ 
int temp = *a; 
*a = *b; 
*b = temp; 
} 

In questo modo, invece di scambiare i puntatori, si sta scambiando le int s che i puntatori siano rivolte -.

1

I puntatori vengono passati per valore. Ciò significa che a & b sono ancora aeb quando tornano dalla funzione;

provare qualcosa di simile

void swap(int* a, int* b) 
{ 
int temp = *a; 
*a = *b; 
*b = temp; 
} 
1

Il modo giusto per farlo:

void swap(int* a, int* b) 
{ 
    int temp = *a; // Temp is set to the value stored at a (5) 
    *a = *b;  // value stored at a is changed to the value stored at b (10) 
    *b = temp;  // value stored in address b is changed to 5. 
} 
2

C è un linguaggio di passaggio per valore. La tua routine swap non dereferenzia i puntatori passati ad essa, quindi dal punto di vista di main non è successo nulla.

1

Si scambia. Scambia i puntatori locali a e b all'interno della funzione swap. Le scambia perfettamente bene, come dovrebbe.

Se si desidera scambiare i valori a cui puntano questi puntatori, è necessario implementare di conseguenza la funzione swap, ovvero scambiare i valori puntati, non i puntatori.

10

tuo swap() funzione fa lavoro, dopo una moda - scambia i valori delle variabili a e b che sono locali a swap(). Sfortunatamente, quelli sono distinti da a e b in main(), quindi in effetti non si vede alcun effetto dallo swapparli.

+0

Dovrebbe essere la risposta accettata. –

0

La risposta di zildjohn1 è il modo più semplice e chiaro per farlo. Tuttavia, se insisti a scambiare i puntatori, devi passare il puntatore al puntatore perché il puntatore stesso viene passato per valore.

4

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.

0

Umm magari usando questo

void swap(int** a, int** b) 
{ 
int** temp = a; 
a = b; 
b = temp; 
} 

int main() 
{ 
int x = 5, y = 10; 
int *a = &x, *b = &y; 
swap(&a, &b); 
printf(“%d %d\n”), *a, *b); 
} 
0

Senza l'utilizzo di una terza variabile (temp)

void swap(int* a,int* b) 
{ 
// a = 10, b = 5; 
    *a = *a + *b; // a now becomes 15 
    *b = *a - *b; // b becomes 10 
    *a = *a - *b; // a becomes 5 
} 
-1

È necessario inviare l'indirizzo di A e B per la funzione di scambio così mentre chiamando la funzione di scambio è necessario call ass swap (& a, & b) In modo da passare l'indirizzo e modificare l'indirizzo

-1
#define SWAP(a,b) ((a)=(b)+(a),(b)=(a)-(b),(a)=(a)-(b)) 

Funziona bene.