Tabla de fichas Indice del Tema 0703
0701 0702 0703 0704 0705 0706 0707 0708

PUNTEROS DE ESTRUCTURAS.







Definición, declaración y acceso.
El procedimiento de declaración de punteros de estructura es el esperable.
struct Tipo_estructura {
	Tipo_1 campo1;
	...
	Tipo_n campo_m;};
struct Tipo_estructura una_estructura;
struct Tipo_estructura * puntero_estructura = &una_estructura;

Al igual que en ocasiones anteriores, el valor de puntero_estructura en este momento no está definido inmediatamente después de su declaración, y es preciso realizar la oportuna asignación.

Acceso a campos. Supuesta una declaración como la anterior, el método empleado para acceder a un campo es el siguiente:

una_estructura.campo_1 = valor1;
una_estructura.campo_2 = valor2;

pero
puntero_estructura->campo_1 = valor_1;
puntero_estructura->campo_2 = valor_2;



Obsérvese la diferencia: cuando la variable es estática, se emplea el operador punto entre el nombre de la variable y el nombre del campo. Cuando la variable es dinámica, se emplea el operador flecha entre el nombre del puntero y el nombre del campo. Véase el oportuno Ejercicio.

Asignación a través de punteros.
No existe diferencia entre el acceso a un campo mediante un puntero y el acceso a un campo directamente a través de una estructura. Ateniéndonos a las declaraciones anteriores, las expresiones una_estructura.un_entero y puntero_estructura->un_entero son completamente equivalentes: donde pueda utilizarse una se podrá emplear la otra.

Los punteros como campos de estructuras.
Según lo indicado en la sección correspondiente, en una estructura es admisible la inserción de campos de cualquier tipo. Esto incluye, ciertamente, los punteros. Además, el uso de punteros como campos de estructuras abre un panorama verdaderamente extenso: las estructuras dinámicas no lineales. Aparecen aquí conceptos como las listas simple y doblemente enlazadas, las listas circulares, las pilas, las colas y los árboles.

Ejercicio.- Construir un programa que muestre el uso de estructuras a través de punteros.

/*
	Este programa muestra la declaración, definición y utilización
	de punteros de estructuras. No hace uso de funciones de asignación
	de memoria. El programa crea una estructura estática y un puntero
	de ella; a continuación se dan valores a los campos de la estructura
	a través de su nombre, para después mostrar en pantalla esos valores
	a través de un puntero.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct Tipo_estructura {	
	int un_entero;
	float un_real;
	char cadena[80];};
	struct Tipo_estructura una_estructura;
	struct Tipo_estructura * puntero_estructura = &una_estructura;
int main(void)
{
	printf("Punteros de estructura.\n\n");
	una_estructura.un_entero = 33;
	una_estructura.un_real = 44.0;
	strcpy(una_estructura.cadena,"Una cadena.");
	
	printf("El valor entero es       : %d\n",puntero_estructura->un_entero);
	printf("El valor real es         : %f\n",puntero_estructura->un_real);
	printf("El valor alfanumérico es : %s\n",puntero_estructura->cadena);
	
	printf("\n\nTerminación normal del programa.\n");
	return 0;
}
/*
	RESULTADO
	Punteros de estructura.	El valor entero es       : 33
	El valor real es         : 44.000000
	El valor alfanumérico es : Una cadena.
	Terminación normal del programa.
*/



Volver a la parte superior de esta página



Ejercicios propuestos



  1. Contruir una función que reciba como parámetro una estructura. ¿Pasa por valor o por referencia? Construir ahora una función que reciba como parámetro un puntero de estructura. ¿Qué sucede ahora?

  2. Construir un tipo de datos basado en una estructura, y adecuado para almacenar tres variables a, b y c de tipo float. Se pide utilizar punteros de este tipo de datos para sumar matrices tridimensionales.

  3. Construir un tipo de datos basado en una estructura, y adecuado para almacenar una lista monodimensional de tres elementos de tipo float. Se pide utilizar punteros de este tipo de datos para restar matrices tridimensionales.

  4. Construir un tipo de datos basado en una estructura, y adecuado para almacenar una lista monodimensional del nueve elementos de tipo float. Se pide utilizar punteros de este tipo de datos para sumar vectores tridimensionales.

  5. Construir un tipo de datos basado en una estructura, y adecuado para almacenar una tabla 3x3. Se pide utilizar punteros de este tipo de datos para multiplicar matrices 3x3.

  6. Construir un tipo de datos basado en una estructura, y adecuado para almacenar una página de un libro, con cada párrafo en una cadena de caracteres. Se pide construir un programa basado en puntero de este tipo de estructura y adecuado para manejar los párrafos de una página.

  7. Se dispone de un tipo de estructura sencillo, de la forma siguiente:
    
    struct Inocente {
     int campo;
     float otro_campo;
     struct Inocente * siguiente;
    };
    
    
    Se pide construir un programa dotado de cinco estructuras como la anterior. El programa debe asignar valores a todos los campos de las estructuras, con una particularidad: el campo siguiente de la primera estructura contiene la dirección de la segunda; el campo siguiente de la segunda estructura contiene la dirección de la tercera, etc. El campo siguiente de la última estructura (la quinta) debe tomar el valor NULL. Dotar al programa de una función que recorra la lista y muestre el contenido de todos sus campos. Esto se llama lista enlazada y tendrá aplicación más adelante.

  8. Modificar el programa anterior para que el campo siguiente de la última estructura tenga como valor la dirección de la primera. La función que recorría la lista en el ejercicio anterior se denomina iterador. ¿Qué le sucede al imponer que quinta->siguiente == &primera? Esto se llama una lista circular. ¿Cómo se puede modificar el iterador para sólo recorra la lista una vez?