2009-11-03 17 views
5

Si suppone che utilizzi puntatori per scambiare inte in un array. Si compila senza errori o avvertimenti ed esegue ma non scambia gli interi. Qualsiasi suggerimento sarebbe utile !!!Utilizzo di puntatori per lo scambio di valori di array int

Ecco il tester:

#import <stdio.h> 

void swap(int ary[]); 

int main( int argc, char*argv[]) 
{ 
    int ary[] = { 25, 50 }; 
    printf("The array values are: %i and %i \n", ary[0], ary[1]); 
    swap(ary); 
    printf("After swaping the values are: %i and %i \n", ary[0], ary[1]); 

    return 0; 
} 

Ecco la funzione swap:

void swap(int ary[]) 
{ 
    int temp = *ary; 
    *ary = *(ary + 1); 
    *ary = temp; 
} 

Questo è ciò che viene visualizzato dopo l'esecuzione:

The array values are: 25 and 50 
After swaping the values are: 25 and 50 

risposta

16

Odio rovinare questo, ma sembra un errore di battitura più di ogni altra cosa.

Nella funzione di scambio:

*ary = temp; 

dovrebbe essere:

*(ary + 1) = temp; 

edit: C'è una ragione non si sta usando la notazione di matrice? Penso che sia un po 'più chiara per cose come questa:

int temp = ary[0]; 
ary[0] = ary[1]; 
ary[1] = temp; 
+1

wow mi sento stupido ora! –

+1

Penso che siamo stati tutti lì. –

+2

Infatti, usare '[]', è molto più pulito. – GManNickG

5

esaminare la vostra funzione di scambio con più attenzione :

void swap(int ary[]) 
{ 
    int temp = *ary; 
    *ary = *(ary + 1); 
    *ary = temp; 
} 

Quando si fa *(ary + 1) vengono assegnati -?

4

si sposta il secondo valore nel primo posto, e quindi spostare il primo valore di nuovo nel primo spot.

0

Prova a modificare:

void swap(int ary[]) 
{ 
    int temp = ary[0]; 
    ary[0] = ary[1]; 
    ary[1] = temp; 
} 
+0

So come farlo con la notazione array ma ci è stato richiesto di usare i puntatori. –

+0

@Josg ti aprirò un piccolo segreto. Puoi prendere [] notazione e creare la cosa, che i compilatori fanno: a [x] = * (a + x) = x [a]. SI! è un piccolo c-trick su a [x] = x [a], perché i compilatori non usano [] -method. – f0b0s

+0

voglio dire, puoi prendere il codice di Peter e modificarlo un po ': arr [1] -> * (arr + 1) – f0b0s

4

solo per divertimento; E 'anche possibile scambiare senza utilizzare un valore temporaneo

void swap(int ary[]) 
{ 
    *ary ^= *(ary + 1); 
    *(ary + 1) ^= *ary; 
    *ary ^= *(ary + 1); 
} 

Come Gman sottolinea, questo codice oscura il vostro intento dal compilatore e il processore, per cui le prestazioni possono essere peggio di utilizzare una variabile temporanea, in particolare su un moderno PROCESSORE.

+0

Cosa fa l'operatore '^ =' qui? Mai visto usato prima di –

+0

'^' è esclusivo o, quindi 'x^= y' significa' x = x^y' –

+1

^è un po 'XOR. 0^0 = 0 1^1 = 0 1^0 = 0 0^1 = 0 – f0b0s

0

la funzione di scambio funziona solo per 2-int array, in modo da mostrare al vostro compilatore (che non cambierà nulla, ma fare più pulito il codice)

void swap(int ary[2]) 
+0

-1 questo non porta a nulla, e in realtà non aiuta nessuno a lungo termine. Il tuo "codice più chiaro" per cercare di aiutarci a capire le tue intenzioni non può sostituire la documentazione decente. –

2

È possibile anche scambiare i valori senza alcuna variabile temporanea:

void swap(int *x, int *y) 
{ 
    *x ^= *y; 
    *y ^= *x; 
    *x ^= *y; 
} 

quindi chiamare:

swap(&ary[0], &ary[1]);