Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda con indireccion multiple ( puntero a puntero )

Estas en el tema de Duda con indireccion multiple ( puntero a puntero ) en el foro de C/C++ en Foros del Web. Vereis, no consigo entender bien el funcionamiento de los punteros a punteros. El problema q tengo al hacer una guia de contactos que me han ...
  #1 (permalink)  
Antiguo 03/09/2009, 12:51
 
Fecha de Ingreso: noviembre-2008
Mensajes: 7
Antigüedad: 15 años, 5 meses
Puntos: 0
Duda con indireccion multiple ( puntero a puntero )

Vereis, no consigo entender bien el funcionamiento de los punteros a punteros.
El problema q tengo al hacer una guia de contactos que me han mandado hacer, en la que los contactos forman una lista enlazada.
Código:
struct contacto{
	int numero_telefono;
	char[20] Nombre;
	char[50] Apellidos;
	char[50] Direccion;
	struct contacto *siguiente;
}
q diferencia abria, a la hora de ejecutar funcion2, entre:

Código:
//Forma 1
void funcion2(struct contacto **persona);

void funcion1(struct contacto *persona){ 
	funcion2(&persona);
}

//Forma 2
void funcion2(struct contacto *persona);

void funcion1(struct contacto *persona){ //Forma 2
	funcion2(persona);
}
A lo que me refiero, es que segun entiendo, en la forma 1 paso directamente la estructura, por lo que los cambios en la funcion2 afectan a la estructura original. Pero probando con el codigo de la forma 2, tambien puedo modificar, x ejemplo, el campo telefono de la estructura, aun habiendola pasado por valor :S

Última edición por tazz_mania91; 04/09/2009 a las 03:25
  #2 (permalink)  
Antiguo 04/09/2009, 09:34
Avatar de Slackin  
Fecha de Ingreso: noviembre-2007
Ubicación: Puerto Montt, Chile
Mensajes: 86
Antigüedad: 16 años, 5 meses
Puntos: 4
Respuesta: Duda con indireccion multiple ( puntero a puntero )

Sería aconsejable que muestres mas de tu codigo; la implementacion de ambas funciones. Con ello podemos ver con mas claridad la interfaz entre tus funciones y la estructura.
Saludos
  #3 (permalink)  
Antiguo 04/09/2009, 14:21
 
Fecha de Ingreso: noviembre-2008
Mensajes: 7
Antigüedad: 15 años, 5 meses
Puntos: 0
Pregunta Respuesta: Duda con indireccion multiple ( puntero a puntero )

Codigo... lo que se dice codigo... mas bien tengo poco
eske e mirado varios manuales sobre implementar una lista enlazada en C, (funciones basicas: buscar, eliminar e insertar ), y en varios de ellos, no en todos, cuando se quiere eliminar o añadir un nodo, se pasa el 1ºer nodo de la lista con un doble puntero. Y eso es lo que no logro entender, ya que, por ejemplo:

Código:
struct contacto{
	int numero_telefono;
	char[20] Nombre;
	char[50] Apellidos;
	char[50] Direccion;
	struct contacto *siguiente;
}

void procesaContacto(struct contacto *persona){
	//Rellena los campos de persona
}

struct contacto *removeContacto(struct contacto *persona,int posición){
	struct contacto *anterior=NULL;
	while(posicion>1){
		anterior=persona;
		persona=persona->siguiente;
		posicion--;
	}
	if(anterior==NULL){
		anterior= persona->siguiente;
		free(persona);
		return anterior;
	}else{
		anterior->siguiente=persona->siguiente;
		free(persona);
		return NULL;
	}
}

struct contacto *gestionarAgenda(struct contacto *contacto){
	//Menu de opciones

	//Switch con opciones: añadir, buscar...
	
	struct contacto *aux=removeContacto(contacto,1);//Aqui tengo la duda
	
	return aux;
}

int main(){
	struct contacto *primero,*aux;
	struct contacto *contacto=(struct contacto*)malloc(sizeof(struct contacto);
	aux=gestionarAgenda(contacto);
	if(aux!=NULL){
		primero=aux;
	}
}
Como e puesto en el codigo, la duda la tengo a la hora de llamar a la funcion removeContacto. Y lo que pido seria si por favor me pudiesen explicar un poco la diferencia entre la declaracion actual de la funcion
Código:
contacto *removeContacto(contacto *persona, int posicion);
y esta otra declaracion
Código:
contacto *removeContacto(contacto **persona,int posicion);
No pido las diferencias "lexicas" en C( es decir, usar (*contacto)->nombre para acceder al campo,etc.. ), si no las diferencias a la hora de que C trabaje el codigo. Gracias
  #4 (permalink)  
Antiguo 05/09/2009, 14:15
Avatar de Slackin  
Fecha de Ingreso: noviembre-2007
Ubicación: Puerto Montt, Chile
Mensajes: 86
Antigüedad: 16 años, 5 meses
Puntos: 4
Respuesta: Duda con indireccion multiple ( puntero a puntero )

En primer caso *persona, tu le estas pasando un puntero o la dirección de una instacia de estructura(struct). Que es la forma mas tipica(*p) a la hora de pasar valores por referencia en las funciones.
En el segundo caso **persona, tu le estas pasando un puntero que guarda la direccion de otro puntero(p1). Este p1 guarda la direccion de una instancia de estructura. He leído por ahí que algunos programadores llaman a evitar estos casos(**p) e intentar implementarlos de otra forma.
De acuerdo a la defincion de tu RemoveContacto, sólo el primer caso hará lo que se desea que haga(el otro debería dar error). Para utilizar el segundo caso habria que hacer las modificaciones siguientes a la clase RemoveContacto:

Código:
struct contacto *removeContacto(struct contacto **persona,int posición){
	struct contacto *anterior=NULL;
	while(posicion>1){
		anterior=*persona;
		*persona=(*persona)->siguiente;
		posicion--;
	}
	if(anterior==NULL){
		anterior= (*persona)->siguiente;
		free(*persona);
		return anterior;
	}else{
		anterior->siguiente=(*persona)->siguiente;
		free(*persona);
                return NULL;
	}
}
Espero que de algo te pueda ayudar esto.
Quizas tambien quieras leer acá: http://es.geocities.com/jorge_hefty/temas2.htm
  #5 (permalink)  
Antiguo 06/09/2009, 10:58
 
Fecha de Ingreso: noviembre-2008
Mensajes: 7
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Duda con indireccion multiple ( puntero a puntero )

Entonces lo mejor sera apañar el codigo para evitar los dobles punteros.
Gracias por aclararlo!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:01.