2010-10-01 16 views
10

Soy nuevo en C y sigo intentando captar el concepto de punteros. Sé cómo escribir una función de intercambio que funciona ... Estoy más preocupado de por qué este en particular no funciona.Función de intercambio simple ... ¿por qué esta no se intercambia?

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 pregunta obvia sería, ¿qué diferencia hay entre esta implementación y su implementación que funciona? (Sé cuál es el problema con este, solo estoy tratando de ayudarte a encontrarlo.) [Por supuesto, todos los castores ansiosos en SO están dispuestos a saltar directamente a la respuesta.] –

+1

Una sólida lección de choque en pasar por valor. Gracias ppl. –

Respuesta

29

Te has perdido * s en la función de intercambio. Proveedores:

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

De esta manera, en lugar de simplemente intercambiando los punteros, estás cambiando las int s que los punteros apuntan -.

1

Los indicadores se pasan por valor. Esto significa que & b siguen siendo ayb cuando vuelve de la función;

intentar algo como esto

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

La forma correcta de hacerlo:

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 es un lenguaje pase por valor. Su rutina swap no desreferencia los punteros pasados ​​a ella, por lo que desde la perspectiva main nada ha sucedido.

1

Sí cambia. Cambia los punteros locales a y b dentro de la función swap. Los intercambia perfectamente bien, como debería.

Si desea cambiar los valores a los que apuntan estos punteros, debe volver a implementar su función swap en consecuencia, es decir, haga que cambie los valores apuntados, no los punteros.

10

Su función swap() hace el trabajo, en cierto modo - que intercambia los valores de las variables a y b que son locales a swap(). Desafortunadamente, esos son distintos de a y b en main(), por lo que no se ve ningún efecto al intercambiarlos.

+0

Debe ser la respuesta aceptada. –

0

La respuesta de zildjohn1 es la forma más fácil y clara de hacerlo. Sin embargo, si insiste en cambiar los punteros, debe pasar el puntero al puntero porque el puntero se pasa por valor.

4

Al pensar en punteros, debe tener en cuenta algunas abstracciones.

Un objeto en la memoria. Esto puede ser de cualquier tipo (y tamaño). Un objeto entero, por ejemplo, ocupará 4 bytes en la memoria (en máquinas de 32 bits). Un objeto de puntero ocupará 4 bytes en la memoria (en máquinas de 32 bits). Como debería ser obvio, el objeto entero contiene valores enteros; un objeto puntero contiene direcciones de otros objetos.

El lenguaje de programación C permite que los símbolos (variables) representen estos objetos en la memoria. Cuando declara,

int i;

el símbolo (variable) i representa algún objeto entero en la memoria. Más específicamente, representa el valor de este objeto. Puede manipular este valor al usar i en el programa.

& le daré la dirección de este objeto en la memoria.

Un objeto de puntero puede contener la dirección de otro objeto. Usted declara un objeto puntero usando la sintaxis,

int * ptr;

Al igual que otras variables, la variable de puntero representa el valor de un objeto, un objeto de puntero. Este valor simplemente es una dirección de algún otro objeto. Establece el valor de un objeto de puntero como así,

ptr = & i;

Ahora, cuando dices ptr en el programa, te estás refiriendo a su valor, que es la dirección de i. Pero si dices * ptr, te estás refiriendo no al valor de ptr, sino más bien al valor del objeto cuya dirección está en ptr, es decir, i.

El problema con la función de intercambio es que está intercambiando valores de punteros, no los valores de los objetos que contienen estos punteros. Para llegar a los valores de los objetos, deberías usar * ptr.

0

Umm tal vez el uso de este

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

Sin utilizar una tercera variable (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

Es necesario enviar la dirección de A y B para la función de intercambio por lo que mientras llamando a la función de intercambio que debe Alternar llamada culo (& una, & b) lo que se pasa la dirección, y alterar la dirección de

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

Funciona bien.

Cuestiones relacionadas