Estimados,
A continuación encontrarán el repaso del taller 4. La grabación del taller se encuentra en la sección: Clases Online. Se adjunta materiales y código fuente de las soluciones de los ejercicios que se realizaron en clase.
El siguiente taller (Taller 5) se dictará el Jueves 7 de Abril de 8 a 10 am. El link de zoom será el mismo para todos los talleres, lo pueden encontrar la sección Novedades.
Taller 4: Punteros y gdb
Requisitos:
- Mandatorio ver la grabación Teórico-Clase 4 (Sección: Clases Online)
- Tener leído Capítulo 5 del Libro K&R.
- Relevamiento sobre instalación de la máquina virtual/ Entornos Linux.
Esquema:
- Introducción a Makefile, revisamos la solución brindada de programación modularizada del taller anterior (Taller 3)
- Repaso de punteros y arreglos.
Un puntero es una variable que contiene la dirección de una variable. Los punteros y los arreglos están estrechamente relacionados, hoy exploraremos esta relación y se mostrará cómo explotarla.
El operador & da la dirección de un objeto, por lo que la sentencia:
p = &c;
asigna la dirección de c a la variable p, y se dice que p "apunta a" c.
El operador * es el operador de indirección o desreferenciación. Cuando este se aplica a un puntero, se accede al objeto al que apunta el puntero.
Supongamos que x e y son números enteros e ip es un puntero a int. Esta secuencia de sentencias muestra cómo declarar un puntero y cómo usar & y *:
int x = 1, y = 2, z[10];
int *ip; /* ip es un puntero a int */
ip = &x; /* ip ahora apunta a x */
y = *ip; /* y ahora es 1 */
*ip = 0; /* x ahora es 0 */
ip = &z[0]; /* ip ahora apunta a z[0] */
Pasaje por referencia y pasaje por valor: el pasaje de argumentos con punteros permite que una función acceda y cambie objetos desde dentro una vez que se llama.
En C, existe una fuerte relación entre los punteros y los arreglos, lo suficientemente fuerte como para que los punteros y los arreglos se analicen simultáneamente. Cualquier operación que se pueda lograr mediante subíndices de matriz también se puede realizar con punteros.
Por definición, el valor de una variable o expresión de tipo arreglo es la dirección del elemento cero del arreglo. Ejemplo:
pa=&a[0]; es igual a pa = a;
Por otro lado, a[i] también se puede escribir como *(a+i), al evaluar a[i], C lo convierte en *(a+i). También pa[i] es idéntico a *(pa+i).
En resumen, una expresión de arreglo e índice es equivalente a una escrita como puntero y desplazamiento.
Hay una diferencia entre el nombre de un arreglo y un puntero que debe tenerse en cuenta. Un puntero es una variable, por lo que pa=a y pa++ son legales. Pero el nombre de un arreglo no es una variable. Construcciones como a=pa y a++ son ilegales.
Cuando se pasa un nombre de un arreglo a una función, lo que se pasa es la ubicación del elemento inicial. Dentro de la función, este argumento es una variable local, por lo que al ser un nombre de un arreglo es un puntero, es decir, una variable que contiene una dirección.
Aritmética de direcciones: si p es un puntero a algún elemento de un arreglo, entonces p++ incrementa p para señalar al siguiente elemento, y p+=i lo incrementa para señalar i elementos más allá de donde lo hace actualmente.
Ejemplo de reserva y liberación de memoria:
int* p = (int *) malloc(sizeof(int) * 3); // Se reservan 3 bloques de memoria, cada uno de tamaño sizeof(int) bytes.
free(p); // Se libera la memoria reservada del puntero p.
- Se pide a los estudiantes que realicen el ejercicio 2 del práctico 5.
Requisitos para el siguiente Taller (Taller 5: estructuras )
- Mandatorio ver la grabación Teórico-Clase 5 (Sección: Clases Online)
- (Recomendado) Leer capítulo 6 del Libro del curso (K & R).
- En caso de tener instalado un sistema operativo que no sea linux (Windows, MAC) instalar virtualBOx y levantar la máquina virtual concedida por los docentes. En caso de dudas realizar la consulta en la sección de Consultas en EVA.
Links de interés:
- Se recomienda lectura de tutorial sobre make y makefiles en la sección de recursos y materiales: link
- Tutorial sobre gdb: link