2009-12-28 8 views
7

¿Cómo se cambian los punteros en una función?Cambiar punteros en una función en el lenguaje de programación C

void ChangePointers(int *p_intP1, int *p_intP2); 

int main() { 

int i = 100, j = 500; 
int *intP1, *intP2; /* pointers */ 
intP1 = &i; 
intP2 = &j; 
printf("%d\n", *intP1); /* prints 100 (i) */ 
printf("%d\n", *intP2); /* prints 500 (j) */ 
ChangePointers(intP1, intP2); 


printf("%d\n", *intP1); /* still prints 100, would like it swapped by now */ 
printf("%d\n", *intP2); /* still prints 500 would like it swapped by now */ 
}/* end main */ 

void ChangePointers(int *p_intP1, int *p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = p_intP2; 
p_intP2 = p_intP1; 
p_intP1= l_intP3; 
} 
+5

En C, * todo * se pasa por valor. Si desea que una función cambie algo, debe pasarle un puntero. Por lo tanto, si desea que una función cambie un puntero, debe pasarle un puntero. Es decir, pasar un puntero a un puntero. Una vez que empiezas a pensar así, todo se vuelve fácil (bueno, no todo, ¡pero al menos funciona como función!) –

Respuesta

14

En C, los parámetros se pasan siempre por valores. Aunque está cambiando los valores de las variables de puntero dentro de la función llamada, los cambios no se reflejan en la función de llamada. Trate de hacer esto:

void ChangePointers(int **p_intP1, int **p_intP2); /*Prototype*/ 

void ChangePointers(int **p_intP1, int **p_intP2) /*Definition*/ 
{ 
    int *l_intP3; /* local for swap */ 
    l_intP3 = *p_intP2; 
    *p_intP2 = *p_intP1; 
    *p_intP1= l_intP3; 
} 

llamada correspondiente desde main() debe ser:

ChangePointers(&intP1, &intP2);/*Passing in the address of the pointers instead of their values*/ 
+0

Ok, ¡muchas gracias! –

5

Cambiar la firma para tomar un puntero a un puntero.

void ChangePointers(int **p_intP1, int **p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1= l_intP3; 
} 

O, si desea que el código de la llamada se vea igual, pareciendo referencias de C++, use una macro.

void ChangePointersImpl(int **p_intP1, int **p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1= l_intP3; 
} 

#define ChangePointers(a,b) ChangePointersImpl(&a, &b) 
2

Está cambiando los valores locales del puntero dentro de la función; una vez que sale, esos cambios no persisten. Si desea cambiar los valores que los punteros apuntan a, que desea:

int intP3; /* local for swap */ 
intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1 = intP3; 

Si desea cambiar los valores de los punteros a sí mismos (por ejemplo, las direcciones) que necesita para aprobar los punteros a los punteros, no los punteros mismos.

13

Necesita un puntero al puntero.

ChangePointers(&intP1, &intP2); 

void ChangePointers(int **p_intP1, int **p_intP2) { 
     int *l_intP3; 
     l_intP3 = *p_intP2; 
     *p_intP2 = *p_intP1; 
     *p_intP1 = l_intP3; 
} 
1

Si desea cambiar los punteros, entonces usted tiene que pasar en las direcciones de los punteros en lugar de los valores del puntero:

void ChangePointers(int **p_intP1, int **p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1= l_intP3; 
} 
2

Además de todas estas respuestas, sólo quería añadir que cuando estaba teniendo problemas para entender los punteros en una situación así me gustaría llevarlo a algo más simple como un int. Decir si estábamos pasando un int a una función:

int x = 10; 
change_int(x); 
printf("%d",x); 
void change_int(int y) 
{ 
    y = 20; 
} 

x, obviamente, todavía imprimir 10. Para cambiar realmente x, que tendría que pasar un puntero a x de modo que se puede modificar directamente x.

int x = 10; 
change_int(&x); 
printf("%d",x); 
void change_int(int *y) 
{ 
    *y = 20; 
} 

ahora imprimirá x 20. Ahora acaba de aplicar este mismo razonamiento que si x era un puntero, entonces usted tiene que pasar un doble puntero. Espero que esto ayude.

1

Consulte here para otra pregunta similar a la explicada. Una vez que haya leído esto, le resultará más fácil comprender otras respuestas anteriores.

Espero que esto ayude, Saludos cordiales, Tom.