Programación 1 Grado de Ingeniería Robótica Tema 6: Datos estructurados ● Índice (sesión 11/11/2015): – Arrays estáticos – Cadenas de caracteres – Funciones de la librería string.h – Punteros ● ● ● Declaración de punteros Operadores de punteros Reserva dinámica de memoria 2 Arrays estáticos ● ● ● ● Hasta ahora hemos utilizado tipos de datos simples: enteros, reales, caracteres... Sin embargo, es posible utilizar colecciones de estos tipos de datos, lo que se conoce como vectores o arrays Un vector o array contendrá un número determinado de elementos de un mismo tipo. Cuando el tamaño del array se determina en tiempo de compilación hablamos de arrays estáticos. Si se determina en tiempo de ejecución tendremos arrays dinámicos Así hablaremos de arrays de: – Enteros – Caracteres – Reales (float o double) – O de cualquier otro tipo... 3 Definición de arrays estáticos ● ● Para definir y utilizar un array estático debemos especificar: – El tipo base de los elementos que contendrá el array – El número de elementos que tendrá Sintaxis de C: tipo identificadorArray[num elementos] – int vectorI[3]; – float vectorF[10]; – char vectorC[256]; – bool vectorB[12]; 4 ● ● Array: acceso e inicialización Para acceder a una posición de un arrray utilizamos el operador [ ]: – ● ● ● VectorI[2] = 3; VectorC[0] = 'a'; VectorB[4] = true; Si nos salimos del tamaño del vector se producirá un fallo de segmentación y se abortará la ejecución del programa (ojo!) Al declarar los arrays, estos contienen basura. Hay que inicializarlos antes de usarlos: int cont; for (cont=0;cont<10;cont++) vectorF[cont] = 0; Otra forma de inicializar un array directamente: – Int array[4] = {0, 1, 2, 3}; 5 ● ● ● Arrays multidimensionales También podemos definir nuestros arrays con varias dimensiones Para ello definimos el tamaño de cada dimensión: – ● El acceso a los datos se hace indicando el índice de cada dimensión – ● float tablaF[10][10]; printf(“%f\n”, tabla[1][8]); También hay que inicializar todos los elementos de cada dimensión: int fila, col; for(fila=0;fila<10;fila++) for(col=0;col<10;col++) tablaF[fila][col] = 0; 6 ● Arrays: paso de parámetros 7 Cadenas de caracteres ● ● En C no existe un tipo específico para trabajar con cadenas de caracteres Se consideran como arrays de caracteres: – ● char cadena[256]; cadena = “Hola mundo”; Internamente, C utiliza el carácter '\0' para marcar el final de una cadena – Tendremos en cuenta el '\0' en el tamaño del array – Las funciones printf y scanf tratan el '\0' automáticamente con %s printf(“%s\n”,cadena); scanf(“%s”, cadena); scanf(%[^\n], cadena); //lee la entrada estandar hasta encontrar \n, sin detenerse en espacios 8 string.h ● Para trabajar con cadenas de caracteres, en C tenemos la librería string.h – ● #include <string.h> Algunas de las funciones que incluye son: – Strlen: size_t strlen(const char *s); – Devuelve el tamaño de la cadena antes de '\0' Strcpy: char *strcpy(char *dest, const char *src); – Copia la cadena origen src en la cadena destino dest. Strcat: char *strcat(char *dest, const char *src); – Concatena la cadena origen src al final de la cadena destino dest Strcmp: int strcmp(const char *s1, const char *s2); ● ● ● ● Compara dos cadenas. Devuelve 0 en caso de que sean iguales. <0 si la primera cadena es menor y >0 si la primera cadena es mayor. Orden lexicográfico. 9 Ejercicios propuestos – Arrays ● Ejercicio 1: Crea un programa completo que declare e inicialice un vector de float de un tamaño determinado por una constante y llame a una función que reciba como parámetro un vector y devuelva el valor correspondiente a la suma de los componentes de dicho vector. Finalmente se mostrará este valor por la salida estándar (pantalla) en la función principal. 10 Ejercicios propuestos - Cadenas ● ● ● Ejercicio 2: Realiza una función que reciba una cadena de caracteres y compruebe si se trata de un palíndromo. Ejercicio 3: Realiza una función que reciba dos parámetros: una cadena de caracteres y un carácter. La función realizará la búsqueda del carácter en la cadena y nos devolverá la posición de la primera ocurrencia del carácter en la cadena o -1 en caso de que no lo encuentre. Ejercicio 4: Se pide implementar una función similar a la del ejercicio 3 pero que devuelva la posición de la última ocurrencia del carácter. 11 Punteros ● ● ● ● Un puntero es una variable que contiene la dirección de memoria de un dato o de otra variable Un puntero puede apuntar a una variable de cualquier tipo: tipos básicos, tipos definidos por el usuario, estructuras de datos, ¡incluso a funciones! Los punteros se pueden utilizar para referenciar y manipular estructuras de datos, para referenciar bloques de memoria asignados dinámicamente y para proveer el paso de parámetros por referencia en llamadas a funciones. Declaración de punteros – Sintaxis de C: – ● Tipo * nombrePuntero; Ejemplos: – int *valor; – char *cadena; – double *resultado; 12 Operadores de punteros ● ● ● Existen dos operadores unarios para trabajar con punteros: * y & *puntero: nos devuelve el contenido de la dirección de memoria apuntado por 'puntero' &variable: nos devuelve la dirección de memoria que referencia a 'variable' 13 Reserva dinámica de memoria ● ● ● Librería stdlib.h Podemos reservar memoria dinámicamente utilizando punteros Funciones: – malloc – calloc – realloc – free 14 Función malloc ● ● ● Sintaxis: void *malloc(size_t size); Devuelve un puntero a una zona de memoria con un espacio reservado de size bytes Función sizeof(tipo) nos devuelve el número de bytes que ocupa el tipo de dato pasado como parámetro 15 Función calloc ● ● Sintaxis: void *calloc(size_t nmemb, size_t size); Nos devuelve un puntero a una zona de memoria en la que se reservan nmemb elementos de size bytes. La memoria se inicializa a 0 16 Función realloc ● Sintaxis: void *realloc(void *ptr, size_t size); ● Cambia el tamaño de memoria reservado para un puntero 17 Función free ● Sintaxis void free(void *ptr); ● Libera la memoria reservada para el puntero ptr ● ● No se ejecuta automáticamente cuando se acaba el ámbito en el que se definió el puntero Las llamadas a free han de ser explícitas 18 Arrays dinámicos multidimensionales ● ● Para definir un array multidimensional de manera dinámica utilizaremos punteros a punteros. Se interpreta como un puntero a un tipo que es un puntero que a su vez es un puntero a un entero (!!!) 19 Punteros: Paso de parámetros ● ● Paso por valor Consecuencia: en funcion tienes una referencia a los elementos del array pero no al array en sí, que es una copia 20 Punteros: Paso de parámetros ● ● Paso por referencia Ahora tenemos referencia a los datos y al propio puntero con lo que podemos modificar la memoria que tiene reservada 21 Programación 1 Grado de Ingeniería Robótica