Tema destacado: Personaliza-Escoge el diseño del foro que más te guste.
Autor
|
Tema: una funcion no es capaz de modificar el valor apuntado de un puntero ? (Leído 1,365 veces)
|
darkxxx
Desconectado
Mensajes: 85
|
bueno resulta que estoy en la etapa de estudio de lista, pila y cola pero en medio del tema me doy cuenta que el conocimiento que tenia sobre los punteros no era suficiente y hace que me tranque al tratar de aprender sobre esas estructuras de dato, ahora la duda que tengo es la siguiente: tengo un puntero (A) en la funcion principal que al principio lo hago apuntar a NULL ahora al llamar a una funcion le paso como argumento el puntero (A) para que la funcion modifique el valor apuntado por el puntero (A) pero resulta que despues de que cambio el valor apuntado por el puntero (A) y termina de ejecutarse el llamado a la funcion cuando reviso el valor apuntado por el puntero (A) resulta que sigue apuntando a NULL es decir que no modifico el valor apuntado por el puntero original Funcion Principal en donde creo el puntero VALOR y le paso el valor apuntado originalmente a NULL a la funcion noHaceNada#include <stdio.h> #include <stdlib.h>
void noHaceNada(int*);
int main() { int *valor; valor = NULL; printf("(main) valor --> %#x\n",valor); noHaceNada(valor); printf("(main) valor --> %#x\n",valor); system("pause"); return 0; } luego en la funcion hago que la funcion ptr apunte a donde apunta temp que seria la direccion de memoria en donde se reservo memoria para el elemento int
void noHaceNada(int *ptr) { int *temp; temp = (int*) malloc(sizeof(int)); printf("(function) temp --> %#x\n",temp); printf("(ptr) ptr --> %#x\n",ptr); ptr = temp; printf("(function) ptr --> %#x\n",ptr); }
pero resulta que al acabar el llamado a la funcion la variable valor sigue apuntando a NULL y esa es mi duda porque sigue apuntando a NULL si en la funcion le digo que apunte a donde apunta temp
saludos
|
|
|
|
« Última modificación: 9 Abril 2009, 10:00 por darkxxx »
|
En línea
|
|
|
|
|
Eternal Idol
|
Sin entrar en grandes detalles a noHaceNada le pasas una direccion de memoria, NULL, mas no la direccion de memoria de la variable valor, por lo tanto dentro de esa funcion ptr es una variable local que apunta a NULL. Si queres modificar la direccion a la que apunta valor tenes que usar un doble puntero (**) o un puntero a referencia (*&, C++).
|
|
|
|
« Última modificación: 9 Abril 2009, 10:14 por Eternal Idol »
|
En línea
|
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
|
Ragnarok
|
En las funciones de C no se puede modificar el valor de las variables, por eso se usan los punteros, pero no se usan así. No modificas la dirección a la que apunta el puntero, sino la información que hay en esa dirección. Así: #include <stdio.h> #include <stdlib.h> int haceAlgo(int *n){ *n += 2; return 0; } int main (){ int *modificable = malloc(sizeof(int)); *modificable = 0; haceAlgo(modificable); printf("%d\n", *modificable); return 0; } Sin embargo, como ves, en "main" no se ve la modificación que se hace a "modificable", puesto que se hace en otra función que podría estar en otro fichero e incluso no tener disponible el código fuente. Por eso es mejor usar los retornos de las funciones cuando sea posible. Este ejemplo que he puesto es de juguete y por eso es posible. Sería así: #include <stdio.h> int haceAlgo(int n){ return n+2; } int main (){ int modificable = 0; modificable = haceAlgo(modificable); printf("%d\n", modificable); return 0; } Sigue leyendo acerca de punteros y verás que todo tiene sentido.
|
|
|
|
|
En línea
|
|
|
|
|
Eternal Idol
|
Ragnarok: la modificacion que haces si se ve (es diferente claro) ... y que la funcion este en otro archivo o no tengas el codigo fuente es irrelevante. Que no puedas modificar la direccion a la que apunta la variable modificable se debe a una sola razon: en tu funcion haceAlgo n es una copia local de modificable que obviamente no tiene la misma direccion sino el mismo contenido (ambas variables apuntan a la memoria reservada con malloc en main). Agrego el codigo original funcionando como darkxxx queria: #include <stdio.h> #include <stdlib.h> void noHaceNada(int **); int main() { int *valor; valor = NULL; printf("(main) valor --> %#x\n",valor); noHaceNada(&valor); printf("(main) valor --> %#x\n",valor); system("pause"); return 0; } void noHaceNada(int **ptr) { int *temp; temp = (int*) malloc(sizeof(int)); printf("(function) temp --> %#x\n",temp); printf("(ptr) *ptr --> %#x\n",*ptr); *ptr = temp; printf("(function) *ptr --> %#x\n",*ptr); }
|
|
|
|
« Última modificación: 9 Abril 2009, 11:38 por Eternal Idol »
|
En línea
|
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
|
Ragnarok
|
Con que no se ve quiero decir que el programador no lo ve, hace el código un poco más oscuro, por eso es mejor usar el retorno de la función y no modificar los parámetros que se le pasan cuando sea posible. A veces esto no es suficiente y hay que recurrir a punteros o parámetros por referencia, y es algo que hay que usar, pero no hay que abusar de ello.
En un mundo ideal en que el código está bien documentado y la gente mira la documentación no habría problema, pero en el mundo real un programador puede perder muchas horas antes de descubrir que hay una función que le está modificando una variable y la forma en que la modifica.
Simplemente, aprovechando que se ha preguntado esto he decidido acotar el alcance de la respuesta, porque al que tiene un martillo todo le parecen clavos.
Por otro lado, creo que con los ejemplos que he puesto sería suficiente para que darkxxx pudiera extrapolar al suyo, pero sólo es mi opinión.
|
|
|
|
|
En línea
|
|
|
|
|
Eternal Idol
|
Con que no se ve quiero decir que el programador no lo ve, hace el código un poco más oscuro, por eso es mejor usar el retorno de la función y no modificar los parámetros que se le pasan cuando sea posible. Es cierto aunque si pasamos la direccion de la variable es de esperar que sea por alguna razon en particular, tambien podemos usar const para indicar lo contrario. Simplemente, aprovechando que se ha preguntado esto he decidido acotar el alcance de la respuesta, porque al que tiene un martillo todo le parecen clavos. Efectivamente hay que saber usar el martillo o cualquiera de las herramientas que uno tiene disponibles para resolver un problema. Por otro lado, creo que con los ejemplos que he puesto sería suficiente para que darkxxx pudiera extrapolar al suyo, pero sólo es mi opinión. No me parece pero por supuesto tambien es mi opinion unicamente.
|
|
|
|
|
En línea
|
 La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
|
|