3.1 Creación
Un puntero es una variable que guarda la dirección de memoria de otro objeto. Para declarar una variabe que sea un puntero, a sintaxis es:
tipo *var-puntero
En la declaración se observa que el nombre de la variable puntero, var-puntero, va precedido del modificador *, el cual significa "puntero a"; tipo especifica el tipo del objeto apuntado, puede ser cualquier tipo primitivo o derivado.
El espacio de memoria requerido para un puntero, es el número de bytes necesarios para especificar una dirección máquina, generalmente 4 bytes.
Un puntero iniciado correctamente siempre apunta a un objeto de un tipo particular. Un puntero no iniciado no se sabe a donde apunta.
3.2 Operaciones con Punteros
A las variables de tipo putero, además de los operadores & (direcció), * (indirección), y el operador de asignación, se les puede aplicar los operadores aritméticos + y - (sólo con enteros), los operadores unitarios ++ y --, y los operadores de relación.
Operación de asignación
El lenguaje C permite que un puntero pueda ser asignado a otro puntero.
Operaciones Aritméticas.
A un puntero se le puede sumar o restar un entero. La aritmética de punteros difiere de la aritmética normal en que aquí la unidad equivale a un objeto del tipo del puntero; esto es, sumar 1 implica que el putero pasará a apuntar al siguiente objeto, del tipo puntero, más allá del apuntado actualmente.
Ejemplo:
int x;
int *p,*q;//declara p y q como punteros
p=&x;//p apunta a x
q=&x;//q aputa a x
La operación p+n, siendo n un entero, avanzará el puntero n enteros más allá del actualmente aputado.
Ejemplo:
p=p+3//hace que p avance tres enteros.
Así mismo, la operación p-q, después de la operación p=p+3 antrior, dará como resultado p.
La operación p-n, siendo n un entero, también es válida.
Si p apunta a x=3, p++ hace que p apunte a x=4, y partiendo de esta sotuación, p-- hace que p apunte de nuevo a x=3.
No se puede sumar, multiplicar, dividir o rotar punteros y tampoco se permite sumarles un real.
Los operadores unitarios &,* tienen prioridad mayor que los operadores aritméticos.
Un puntero a cualquier tipo de objeto puede ser convertido al tipo void*, y recibe el nombre de puntero genérico.
3.3 Referencias
Una referencia es un alias de otra variable. Se declara utilizando el operador de referencia (&) que se añade al tipo de la referencia.
Utilización de referencia:
main()
{
int n=75;
int& r=n;
}
Ejecución:
n=75, r=75
3.4 Arreglos unidimensionales, bidimensionales y multidimensionales
Un arreglo unidimensional se caracteriza por tener un solo subídice. Estos arreglos se conocen también por el término de listas.
C++ crea arreglos unidimensionales con el siguiente formato:
tipo nombre [tamaño];
Los arreglos multidimensionales son aquellos que tienen más de una dimensión conocidos tambien por el nombre de tablas o matrices.
Un arreglo de dos dimensiones equivale a una tabla con multiples filas y multiples columnas. Su sintaxis es:
tipo nombre [numero filas][numero columnas]
Ejemplo:
char pantalla[25][80];
Para declarar un arreglo multidimensional es:
tipo nombre [tamaño1][tamaño2][tamañon];
Cadena de caracteres
Una cadena de caracteres se almacea como una matriz unidimensional de elementos de tipo unsigned char o char.
Ejemplo:
char cadena;
Una matriz unidimensional de caracteres puede ser iniciada en el momento de su definición.
Ejemplo:
char cadena()={'a'.'b','c','d'};
Si se crea una matriz de caracteres y se le asigna un número de caracteres menor que su tamaño, el resto de los elementos quedan con el valor 0 si la matriz global o con basura si es local.
3.6 Asignación dinámica de memoria
La asignación dinámica de memoria consiste en asignar la cantidad de memoria necesaria para almacenar un objeto durante la ejecució de un programa, en vez de hacerlo en el momento de la compilación del mismo. Cuando se asigna memoria para un objeto de un tipo cualquiera, se devuelve un puntero a la zona de memoria asignada.
Lo que tiene que hacer el compilador es asignar una cantidad fija de memoria para almacenar la dirección del objeto asignado para el objeto en sí.
Esto implica declarar un puntero a un tipo de datos igual al tipo del objeto que se quiere asignar dinámicamente.
Funciones para asignación dinámica de memoria
La vivlioteca C proporciona una función para asignar memoria dinámicamente (malloc) y otra para liberar el espacio de memoria asignado para un objeto cuando éste ya no sea necesario (free).
Malloc
Permite asignar un bloque de memoria de nbytes consecutivos en memoria para almacear uno o más objetos de un tipo cualquiera.
Esta función devuelve un puntero genérico (void*) que referecia el espacio asignado. Su sintaxis es:
#include (stdlib.h)
void *malloc (size_t nbytes);
Free
Permite liberar un bloque de memoria asignado por las funciones malloc, calloc o realloc. Si el puntero que referecia el bloque de memoria que deseamos liberar es nulo, la función free no hace nada. Su sintaxis es:
#include (stdlib.h)
void free(void *puntero);
Si la memoria liberada por free no ha sido previamente asignada por malloc, calloc o realloc, se pueden producir errores durante la ejecución del programa.
3.7 Uso de clases predefinidas para arreglos
En el lenguaje de programación C una estructura(struct) es lo mismo que una clase, en este caso se explica referente a un struct.
Se puede crear un array de estructuras tal como se crea un array de otros tipos. Los arrays de estructuras son idóneos para almacenar un archivo completo de empleados, un archivo de inventario, o cualquier otro conjunto de datos que se adapte a un formato de estructura. Mientras que los arrays proporcionan un medio práctico de almacenar diversos valores del mismo tipo, los arrays de estructuras le permiten almacenar juntos diversos valores de diferentes tipos, agrupados como estructuras.
Muchos programadores de C utilizan arrays de estructuras como un método para almacenar datos en un archivo de disco. Se pueden introducir y calcular sus datos de disco en arrays de estructuras y a continuación almacenar esas estructuras en memoria. Los arrays de estructura proporcionan también un medio de guardar datos que se leen del disco.
La declaración de un array de estructuras info_libro se puede hacer de un modo similar a cualquier array es decir:
struc info_libro libros [100];
Asigna un array de 100 elementos denominado libros. Para acceder a los miembros de cada uno de los elementos estructura se utiliza una notación de array. Para inicializar el primer elemento de libros, por ejemplo, su código debe hacer referencia a los miembros de libros [0] de la forma siguiente:
strcpy (libros [0].titulo, "C++ a su alcance");
Programación en C++ Algoritmos, estructuras de datos y objetos;Luis Joyanes Aguilar;Mc Graw Hill; Pags.: 161,162,165,166,167,197,198,199,200,202,209,217,218.