Programación en C para electrónicos Datos estructurados Programación en C para electrónicos
Índice Punteros. Vectores. (Arrays) Cadenas de caracteres. Matrices. Vectores multidimensionales. Cadenas de caracteres. Estructuras y Uniones. Tipos enumerados. Definición de nuevos tipos. Datos estructurados - David Carmona 2010
Objetivos Datos estructurados - David Carmona 2010
Punteros Programación en C para electrónica Datos estructurados - David Carmona 2010
Punteros Un puntero es una variable que puede almacenar una dirección de memoria. Normalmente los punteros contienen la dirección de memoria de otra variable. Los punteros apuntan a una variable cuando contienen la dirección de memoria de dicha variable. Datos estructurados - David Carmona 2010
Operadores En la declaración y uso de los punteros se utilizan los operadores * y & (unarios) . & (dirección): Permite obtener la dirección de memoria de una variable. * (indirección): Permite obtener el contenido de una dirección de memoria. También se utiliza para la declaración de punteros. Datos estructurados - David Carmona 2010
Declaración de punteros Sintaxis: Tipo_dato * Nombre_Puntero Un puntero debe estar asociado a un tipo de dato concreto. No pueden asignarse a un puntero direcciones de datos de distinto tipo. Cuando asignamos un tipo a un puntero indicamos la cantidad de memoria que ocupa el dato a partir de la dirección de memoria. Datos estructurados - David Carmona 2010
Tipos de punteros Los punteros se pueden declarar de cualquier tipo de dato de C. int, char, float…. El tipo de dato utilizado en la declaración de un puntero debe ser del mismo tipo que las variables a las puede apuntar. El tipo de datos void, define un puntero genérico cuyo tipo es el del tipo de la variable a la que apunta. Datos estructurados - David Carmona 2010
Puntero void El puntero ip, primero apunta a una variable entera y después a una de tipo char. Datos estructurados - David Carmona 2010
Asignación de direcciones El operador & permite obtener la dirección que ocupa una variable en memoria. Los tipos del puntero y la variable deben ser el mismo (excepto void). Ejemplo: Datos estructurados - David Carmona 2010
//asigna el valor 172 a la p. mem. apuntada Indirección Indirección es la forma de hacer referencia al valor de una variable a través de un puntero que apunta a dicha variable. Para acceder al valor contenido en la dirección de memoria apuntada por un puntero se utiliza el operador *. Ejemplo: *puntero=172; //asigna el valor 172 a la p. mem. apuntada Datos estructurados - David Carmona 2010
Ejemplo: Datos estructurados - David Carmona 2010
Operaciones con punteros Asignación entre punteros: Podemos asignar un puntero a otro siempre que sean del mismo tipo. Después de la asignación ambos punteros contienen la misma dirección por lo tanto apuntan a la misma variable. Datos estructurados - David Carmona 2010
Operaciones con punteros Aritmética de punteros: Sumar un valor a un puntero implica el incremento de la posición de memoria a la que apunta. El incremento en la dirección se hace en múltiplos del tamaño del tipo de dato. Si a un puntero de tipo float (4 bytes) contiene la dirección 1007, y se le suma 1 (puntero++) la dirección apuntada pasará a ser 1011 Datos estructurados - David Carmona 2010
Ejemplo: Dirección valor 1000 short a 1001 1002 short b 1003 1004 short c 1005 1006 short d 1007 1008 float r 1009 1010 1011 Datos estructurados - David Carmona 2010
Vectores Programación en C para electrónica Datos estructurados - David Carmona 2010
Vectores Un vector o array, es un grupo de datos del mismo tipo que ocupan posiciones de memoria contiguas. Los datos de un vector se encuentran agrupados bajo un mismo identificador (nombre). Para acceder a cada elemento del vector se utilizan subíndices. (nº de elemento del vector) Datos estructurados - David Carmona 2010
Declaración de vectores. Sintaxis: Tipo_dato Nombre_vector [tamaño] Donde: Tipo_dato es el tipo de dato de todos los elementos del vector. Nombre_vector es el identificador. tamaño es el número de elementos del vector. Datos estructurados - David Carmona 2010
Declaración de vectores. Ejemplo: float temperaturas [100]; //vector para almacenar 100 temperaturas Inicialización: Los vectores se pueden inicializar en la declaración encerrando la lista de valores entre llaves y separando cada elemento por comas. Datos estructurados - David Carmona 2010
Acceso a los elementos Para acceder a un elemento del vector, se utiliza su nombre y un índice. Valor o expresión entera. El primer elemento del vector tiene índice 0 y el último; tamaño-1. El índice debe estar siempre entre estos dos valores. Datos estructurados - David Carmona 2010
Acceso a los elementos Ejemplos: int contador[10]; … contador[0]=10; contador[i+1]=127; int b=contador[9]; contador[x]=7; Datos estructurados - David Carmona 2010
Limitaciones del vector No se pueden comparar vectores. No se puede copiar un vector completo a otro con una asignación. Se puede hacer elemento a elemento. Datos estructurados - David Carmona 2010
Tipo_dato Nombre_vector [tamaño_x] [tamaño_y] Matrices Una matriz es un vector de dos dimensiones. Los conceptos de acceso, consulta e inicialización de elementos es similar a los de los vectores. Sintaxis de la declaración: Tipo_dato Nombre_vector [tamaño_x] [tamaño_y] tamaño_x y tamaño_y representan el numero de filas y columnas de la matriz respectivamente. Datos estructurados - David Carmona 2010
Almacenamiento Los elementos de una matriz se almacenen en memoria por filas. A continuación del último elemento de una fila se almacena el primer elemento de la fila siguiente. Datos estructurados - David Carmona 2010
Asignación y consulta Para acceder a un elemento se utiliza el nombre de la matriz y dos índices (uno por dimensión) entre corchetes. El valor del índice de cada dimensión oscila entre el 0 y el tamaño de la dimensión menos 1. Ejemplo: float temperaturas [10][10]; //matriz para almacenar 100 temperaturas temperatura [0][1]=27,6; Datos estructurados - David Carmona 2010
Inicialización Sin agrupar filas: Agrupando filas: Datos estructurados - David Carmona 2010
Vectores multidimensionales Datos estructurados - David Carmona 2010
Punteros y vectores En C el nombre de un vector se trata como un puntero que contiene la dirección del primer elemento del vector. El nombre del vector es una constante de tipo puntero que no puede ser modificada. Se permite el uso de punteros que contengan direcciones de elementos del vector para acceder a ellos utilizando la aritmética de punteros. Datos estructurados - David Carmona 2010
Ejemplo Datos estructurados - David Carmona 2010
Punteros y vectores En un puntero que apunta a los elementos de una tabla, pueden usarse los corchetes para indexar dichos elementos, como en un vector: Este tipo de indexaciones solo es válido si el puntero apunta al vector. No se comprueba si el puntero apunta al vector o fuera de el. Datos estructurados - David Carmona 2010
Cadenas de caracteres Programación en C para electrónica Datos estructurados - David Carmona 2010
Cadenas de caracteres Una cadena de caracteres es un vector de tipo char. Se les conoce como string. Las cadenas de caracteres son tratadas de forma especial. En C existe un archivo de cabecera (string.h) con funciones especializadas en el manejo de cadenas de caracteres. Datos estructurados - David Carmona 2010
Cadenas de caracteres Para que un vector sea considerado como cadena de caracteres debe finalizar con el carácter nulo (ASCII 0). El contenido a partir del carácter nulo se ignora. Para declarar una cadena de caracteres de tamaño N hay que reservar memoria N+1 caracteres. Datos estructurados - David Carmona 2010
Declaración e inicialización En la declaración se puede inicializar la cadena como hasta ahora: En el caso de las cadenas, la forma equivalente es: El compilador inserta caracteres nulos (\0) después del último carácter de la asignación. Datos estructurados - David Carmona 2010
Declaración e inicialización Sintaxis general: char Nombre_Cadena [ tamaño ] = “Cadena”; Ejemplo: char ciudad [30] = “Valencia”; Se puede obviar el tamaño de la cadena en la declaración El compilador reservará el espacio justo para albergar la cadena. char ciudad [] = “Valencia”; Datos estructurados - David Carmona 2010
Cadena vacía (“”) Una cadena vacía es aquella que consta únicamente del carácter nulo (\0) Los caracteres siguientes al carácter nulo son ignorados. Para vaciar una cadena basta con asignar el carácter nulo al primer carácter de la cadena. Datos estructurados - David Carmona 2010
Manejo de cadenas La librería string.h incorpora funciones para el manejo de cadenas de caracteres: Datos estructurados - David Carmona 2010
E/S de cadenas Las funciones printf y scanf disponen de un formato especial para cadenas de caracteres (%s) Este formato permite capturar del teclado cadenas que no contengan espacios, tabuladores o saltos de línea. Datos estructurados - David Carmona 2010
E/S de cadenas Además, la librería stdio.h dispone de otras funciones para tratamiento de cadenas en la entrada y salida: Estas funciones permiten la entrada de cadenas que contengan espacios, tabuladores… Datos estructurados - David Carmona 2010
Estructuras y uniones Programación en C para electrónica Datos estructurados - David Carmona 2010
Estructura Una estructura es un conjunto de datos de distintos tipos que ocupan posiciones de memoria contiguas. Los elementos (campos) de una estructura pueden ser de cualquier tipo de los vistos hasta ahora. Los elementos de una estructura se referencian a través del nombre de la misma. Datos estructurados - David Carmona 2010
Definición La definición de una estructura requiere especificar el nombre y tipo de todos los campos de la estructura. Para la definición de la estructura se utiliza la palabra reservada struct. Una vez definida la estructura, se pueden crear tantos datos de la estructura como se quieran. El nombre de la estructura se utiliza como un tipo de dato más a la hora de declarar variables de ese tipo. Datos estructurados - David Carmona 2010
Sintaxis Datos estructurados - David Carmona 2010
Declaración de variables Se utiliza la palabra reservada struct y el nombre de la estructura. También se pueden declarar variables de la estructura creada en la definición de la misma. Datos estructurados - David Carmona 2010
Ejemplos Datos estructurados - David Carmona 2010
Variable.nombre_campo Acceso a los campos Para acceder a un campo de una estrutura se utiliza el operador . (punto) La forma general de acceso a campos es : Variable.nombre_campo Ejemplo: Nuevo_cliente.dni = 12345678; Datos estructurados - David Carmona 2010
Inicialización Se puede asignar valor a todos los campos de la variable en el momento de declararla. Se encierran entre llaves los valores y se separan con comas (,) en el mismo orden de la definición. Ejemplo: Datos estructurados - David Carmona 2010
Copia y comparación No se pueden comparar mediante los operadores relacionales variables del mismo tipo de estructura. Se deben comparar los campos individualmente. Se pueden copiar todos los campos de una variable a otra mediante la asignación simple: struct cliente cliente1,Nuevo_cliente; … Nuevo_cliente = cliente1; Datos estructurados - David Carmona 2010
Uniones Pueden contener varios campos de distinto tipo. Todos los campos de la unión comparten espacio de memoria. Una variable de este tipo solo puede almacenar el valor de uno de los campos. La unión ocupa el mismo espacio de memoria que el campo de mayor tamaño. Datos estructurados - David Carmona 2010
Definición La definición y declaración de variables de una unión es análoga al de las estructuras. Se utiliza la palabra reservada union. Datos estructurados - David Carmona 2010
Tipos enumerados Programación en C para electrónica Datos estructurados - David Carmona 2010
Tipos enumerados Es un conjunto ordenado de constantes enteras a las que se le asigna un nombre. Los nombres representan todos los valores que puede tomar la variable. El compilador les asigna un valor entero según el orden de las constantes y empezando por 0. Datos estructurados - David Carmona 2010
Definición Se utiliza la palabra reservada enum, seguida del nombre de la enumeración y de la lista de nombres de las constantes. Ejemplo: enum Nombre_Enum { Const1, Const2, … ConstN}; Datos estructurados - David Carmona 2010
Declaración de variables La declaración de variables enumeradas puede hacerse en la definición: O posteriormente utilizando la siguiente sintaxis: enum dia_semana { Lunes, Martes, Miercoles, Jueves, Viernes, Sabado,Domingo} dia; enum dia_semana dia; Datos estructurados - David Carmona 2010
Cambio de valores Por defecto, a los nombres se les asigna un valor entero, por orden de aparición en la definición y empezando desde 0. Se puede cambiar el valor por defecto mediante asignaciones en la definición. Datos estructurados - David Carmona 2010
Definición de nuevos tipos. Programación en C para electrónica Datos estructurados - David Carmona 2010
typedef tipo_datos Nombre_nuevo_tipo; El lenguaje C permite definir nuevos tipos de datos basados en los tipos vistos hasta ahora. Para definir los nuevos tipos se utiliza la palabra reservada typedef, con la siguiente sintaxis: Una vez definido el nuevo tipo, el nombre se puede utilizar como tipo de datos en la declaración de variables. typedef tipo_datos Nombre_nuevo_tipo; Datos estructurados - David Carmona 2010
Ejemplos: Datos estructurados - David Carmona 2010