2009-11-03 21 views
5

Se supone que debo usar punteros para intercambiar enteros en una matriz. Se compila sin errores ni advertencias y se ejecuta, pero no intercambia las entradas. ¡¡¡Cualquier sugerencia sería útil!!!Usando punteros para intercambiar valores de matriz int

Aquí está el probador:

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

Aquí es la función de intercambio:

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

Esto es lo que se muestra después de ejecutar:

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

Respuesta

16

Odio echar a perder esto, pero parece más un error tipográfico que nada.

En su función de intercambio:

*ary = temp; 

debería ser:

*(ary + 1) = temp; 

edición: ¿Hay alguna razón usted no está usando la notación de matriz? Creo que es un poco más claro para cosas como esta:

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

wow me siento estúpido ahora! –

+1

Creo que todos hemos estado allí. –

+2

De hecho, use '[]', es mucho más limpio. – GManNickG

5

examinar su función de intercambio con más cuidado :

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

¿Cuándo se asigna *(ary + 1)a?

4

mueve el segundo valor en el primer lugar, y luego pasar el primer valor de nuevo en el primer lugar.

0

Tal vez puedas probar:

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

Sé cómo hacerlo con la notación de matriz, pero se nos pidió que usáramos punteros. –

+0

@Josg te abriré un pequeño secreto. Puede tomar la notación [] y hacer lo que hacen los compiladores: a [x] = * (a + x) = x [a]. ¡SÍ! es un pequeño truco C sobre a [x] = x [a], porque los compiladores no usan [] -metodo. – f0b0s

+0

quiero decir que puedes tomar el código de Pedro y simplemente editarlo un poco: arr [1] -> * (arr + 1) – f0b0s

4

sólo por diversión; También es posible intercambiar sin necesidad de utilizar un valor temporal

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

Como GMan señala, este código oscurece su intención de que el compilador y el procesador, por lo que el rendimiento puede ser peor que el uso de una variable temporal, especialmente en una moderna UPC.

+0

¿Qué hace el operador '^ =' aquí? Nunca lo he visto usado antes –

+0

'^' es exclusivo o, por lo que 'x^= y' significa' x = x^y' –

+1

^es un poco XOR. 0^0 = 0 1^1 = 0 1^0 = 0 0^1 = 0 – f0b0s

0

su función de intercambio sólo funcionará durante 2-enteros matriz, por lo que mostrarlo a su compilador (que no va a cambiar nada, pero hacer código más limpio)

void swap(int ary[2]) 
+0

-1 esto no logra nada, y realmente no ayuda a nadie en el largo plazo. Su "código más claro" para tratar de ayudarnos a comprender su intención no puede sustituir la documentación decente. –

2

También puede cambiar los valores sin ningún variable temporal:

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

luego llamar a:

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