Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.



Documentos relacionados
El lenguaje de Programación C. Fernando J. Pereda

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8

FUNDAMENTOS DE PROGRAMACIÓN

Tema: Arreglos de Objetos en C++.

Clases y Objetos. Informática II Ingeniería Electrónica

Tema 2. Memoria Dinámica. 2.1 Datos estáticos y dinámicos

Examen de Fundamentos de sistemas distribuidos

Organización de Computadoras

TIPOS DE DATOS DEFINIDOS POR EL PROGRAMADOR: Estructuras CONTENIDOS

Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria.

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Introducción a la programación orientada a objetos

Contenidos. Funciones (suplemento) Funciones. Justificación del uso de Funciones

Prof. Dr. Paul Bustamante

Una variable de clase escalar tiene un nivel de indirección igual a 1. Por ejemplo, las variables i, b y x definidas como se muestra a continuación.

1. Manejo de memoria estática 2. Manejo de memoria dinámica

Introducción al tipo de dato ARRAY

Java Inicial (20 horas)

Instituto Politécnico Nacional

Tema: Sobrecarga de Operadores.

Repaso sobre lectura de datos desde la línea de comandos, manejo de memoria dinámica e introducción a la librería GSL

LENGUAJE. Tema 1 - Introducción

Se guardan en archivos con extencion c y los cabezales con extension h

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1.

Sistemas Operativos Práctica 3

ARCHIVOS. 1. Introducción. 2. Definición de archivo. 3. Archivos de acceso secuencial. 4. Gestión de un archivo secuencial de estructuras

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Esquema de un programa en C: bloques básicos

SOLUCION EXAMEN junio 2006

DEFINICION. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006

Constructores y Destructores

Modulo 1 El lenguaje Java

Vectores y matrices. Fundamentos de Programación Fundamentos de Programación I

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

Tema 9. Vectores y Matrices

Procesadores de lenguaje Tema 5 Comprobación de tipos

Prof. Dr. Paul Bustamante

Preliminares. Tipos de variables y Expresiones

Tema 4. Clases y objetos en C Introducción

7. Manejo de Archivos en C.

Problemas de Redes de Computadores. Conjunto de problemas 1

PRÁCTICA DE LABORATORIO 3 Tipo Abstrato de Dato

11. Algunas clases estándar de Java (II)

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1

Vectores y matrices. Arrays Declaración Creación Acceso a los elementos de un array Manipulación de vectores y matrices

Prof. Dr. Paul Bustamante

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Programación orientada a objetos

1. Cuestiones. Ejercicios resueltos de C. Diego Rodríguez-Losada 1. //a) #include <stdio.h> main( ) { int x = 0, y = 0; //b) #include <stdio.

Estructura de Datos [Tipos de datos concretos y tipos de datos abstractos]

Creación y destrucción de objetos

Programación Avanzada para Sistemas de Telecomunicación. Objetos y clases. J.C. Cruellas. Objetos y clases

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Programación en C++/Funciones

Programación Avanzada para Sistemas de Telecomunicación Arrays

9. Objetos y clases Clases

Arrays y Cadenas en C

Unidad III El lenguaje de programación C

Introducción a la Programación Orientada a Objetos

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

Programación Estructurada

Lenguaje C Bucles, Condicionales, operadores y Algoritmos.

Introducción al lenguaje JAVA

Contenido. Capítulo 1. Introducción a lenguaje C 1

Lenguaje de Programación: Go

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

ELO329: Diseño y Programación Orientados a Objetos 20 de Junio de Certamen Final

1. Introducción. 1.1 Ejercicio 1: Estación Meteorológica (4.0 pts.) Ejercicio 2: Gestión Académica: Alumnos (5.0 pts.)...

Plantillas: un mecanismo de polimorfismo

Sea el siguiente programa de nombre "c0p1" para copiar archivos (por simplicidad se ha eliminado todo control de errores): Se pide:

Árboles. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

Examen de Fundamentos de sistemas operativos

Contenidos. Archivos en C++ Archivos en C++ Introducción

CONTENIDO. Programación orientada a objetos - POO. Clases. Constructores y destructores. Definiciones. Entrada y salida

Prof. Dr. Paul Bustamante

Estructura de datos tipo vector.

Vectores. 27/05/05 Programación Digital I 1

INSTITUTO TECNOLOGICO de la laguna Programación Orientada a Objetos en C++

Pseudolenguaje. (1 byte) (valores códigos ASCII) [CHAR_MIN.. CHAR_MAX] (Definida en <limits.h>) No hay. Dominio n 1 [MIN(C)..

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

Arreglos. // Incluir E/S y Librerías Standard #include <stdlib.h> #include <stdio.h>

Punteros. Programación en C 1

Lenguaje C Funciones. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Examen Principios de Programación Febrero 2012

Sistemas Operativos. Curso 2016 Procesos

Práctica 2 Gráficos Vectoriales con SVG (versión )

Ejercicio 1 (3 puntos).-

Clases y funciones amigas: friend

Práctica 3: Programación con subrutinas

Ejercicios del tema 7: Clases y objetos

INTRODUCCIÓN. Estructura de Datos Tipos Abstractos de Datos (TAD S) Profs. Lorna Figueroa M. Mauricio Solar F. UTFSM 1 / 2008

Actividades de Divulgación del Centro Atómico Bariloche. Qué hay detrás de un programa de computadora? Daniela Arnica Pablo E. Argañaras.

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

EJERCICIOS DEL TEMA 1

SOR -::- Prácticas -::- Curso 05/06. RCP es un estándar desarrollado por Sun Microsystems y usado por muchos distribuidores de sistemas UNIX.

Capítulo 6. Introducción a la POO

Programación. Ejercicios Tema 4 Estructuras de Control Repetitivas

Ejercicio 1 (2 puntos. Tiempo: 25 minutos)

Transcripción:

Punteros Definición Un puntero es un dato que contiene una dirección de memoria. NOTA: Existe una dirección especial que se representa por medio de la constante NULL (definida en <stdlib.h>) y se emplea cuando queremos indicar que un puntero no apunta a ninguna dirección. Declaración <tipo> *<identificador> <tipo> Tipo de dato del objeto referenciado por el puntero <identificador> Identificador de la variable de tipo puntero. Cuando se declara un puntero se reserva memoria para albergar una dirección de memoria, pero NO PARA ALMACENAR EL DATO AL QUE APUNTA EL PUNTERO. El espacio de memoria reservado para almacenar un puntero es el mismo independientemente del tipo de dato al que apunte: el espacio que ocupa una dirección de memoria. char c = a ; char *ptrc; int *ptri;

Operaciones básicas con punteros Dirección Operador & &<id> devuelve la dirección de memoria donde comienza la variable <id>. El operador & se utiliza para asignar valores a datos de tipo puntero: int i; int *ptr;... ptr = &i; Indirección Operador * *<ptr> devuelve el contenido del objeto referenciado por el puntero <ptr>. El operador * se usa para acceder a los objetos a los que apunta un puntero: char c; char *ptr; ptr = &c; *ptr = A ; // Equivale a escribir: c = A

Asignación Operador = A un puntero se le puede asignar una dirección de memoria concreta, la dirección de una variable o el contenido de otro puntero. Una dirección de memoria concreta: int *ptr;... ptr = 0x1F3CE00A;... ptr = NULL; La dirección de una variable del tipo al que apunta el puntero: char c; char *ptr;... ptr = &c; Otro puntero del mismo tipo: char c; char *ptr1; char *ptr2; ptr1 = &c; ptr2 = ptr1; Como todas las variables, los punteros también contienen basura cuando se declaran, por lo que es una buena costumbre inicializarlos con NULL.

Ejemplo int main () int y = 5; int z = 3; int *nptr; int *mptr; nptr = &y; z = *nptr; *nptr = 7; mptr = nptr; mptr = *z; *mptr = *nptr; y = (*nptr) + 1; return 0;

Errores comunes Asignar punteros de distinto tipo int a = 10; int *ptri = NULL; double x = 5.0; double *ptrf = NULL;... ptri = &a; ptrf = &x; ptrf = ptri; // ERROR Utilizar punteros no inicializados char *ptr; *ptr = a ; // ERROR Asignar valores a un puntero y no a la variable a la que apunta int n; int *ptr = &n; ptr = 9; // ERROR Intentar asignarle un valor al dato apuntado por un puntero cuando éste es NULL int *ptr = NULL; *ptr = 9; // ERROR

Punteros a punteros Un puntero a puntero es un puntero que contiene la dirección de memoria de otro puntero- int main () int a = 5; int *p; int **q; // Puntero a entero // Puntero a puntero p = &a; q = &p; Para acceder al valor de la variable a podemos escribir a (forma habitual) *p (a través del puntero p) **q (a través del puntero a puntero q) q contiene la dirección de p, que contiene la dirección de a

Aritmética de punteros Correspondencia entre punteros y vectores Cuando declaramos un vector en realidad <tipo> <identificador> [<dim>] 1. Reservamos memoria para almacenar <dim> elementos de tipo <tipo>. 2. Creamos un puntero <identificador> que apunta a la primera posición de la memoria reservada para almacenar los componentes del vector. Por tanto, el identificador del vector es un puntero. int v[3]; int *ptr;... ptr = v; // Equivale a ptr = &v[0] v[0] = 6; // *v = 6; *(&v[0]) = 6; Aritmética de punteros <tipo> *ptr; ptr + <desplazamiento> devuelve un puntero a la posición de memoria sizeof(<tipo>)*<desplazamiento> bytes por encima de ptr. int v[]; int *ptr = v; ptr+i apunta a v[i] *(ptr+i) v[i] NOTA: La suma de punteros no tiene sentido y no está permitida. La resta sólo tiene sentido cuando ambos apuntan al mismo vector y nos da la distancia entre las posiciones del vector (en número de elementos).

Ejemplo: Distintas formas de sumar los elementos de un vector int suma ( int v[], int N) int i, suma; int *ptr, *ptrfin; suma = 0; for (i=0 ; i<n ; i++) suma = suma + v[i]; /* Alternativa 1 */ suma = 0; for (i=0 ; i<n ; i++) suma = suma + (*(v+i)); /* Alternativa 2 */ /* Alternativa 3 */ suma = 0; ptrfin = ptr + N-1; for (ptr=v ; ptr<=ptrfin ; ptr++) suma = suma + *ptr; return suma; Punteros y matrices <tipo> mat [<dimf>][<dimc>]; dirección(i,j) = dirección(0,0) + i*dimc + j

Ejemplo: Intercambio de valores void Cambia(int *a, int *b) int aux; aux = *a; *a = *b; *b = aux; int main() int x=0, y=1; Cambia(&x,&y); return 0;

Gestión dinámica de la memoria Organización de la memoria Segmento de código (código del programa). Memoria estática (variables globales y estáticas). Pila (stack): Variables automáticas (locales). Heap ( montón ): Variables dinámicas. Reserva y liberación de memoria Cuando se quiere utilizar el heap, primero hay que reservar la memoria que se desea ocupar: ANSI C: Función malloc C++: Operador new Al reservar memoria, puede que no quede espacio libre suficiente, por lo que hemos de comprobar que no se haya producido un fallo de memoria (esto es, ver si la dirección de memoria devuelta es distinta de NULL). Tras utilizar la memoria reservada dinámicamente, hay que liberar el espacio reservado: ANSI C: Función free C++: Operadore delete Si se nos olvida liberar la memoria, ese espacio de memoria nunca lo podremos volver a utilizar

Ejemplo: Vector de tamaño dinámico #include <stdio.h> #include <stdlib.h> float media (float v[], int n) int i; float suma = 0; for (i=0; i<n; i++) suma += v[i]; return suma/n; int main(int argc, char *argv[]) int i; int n; float *v; printf("número de elementos del vector: "); scanf("%d",&n); // Creación del vector v = malloc(n*sizeof(float)); // Manejo del vector for (i=0; i<n; i++) v[i] = i; printf("media = %f\n", media(v,n)); // Liberación de memoria free(v); return 0;

Ejemplo: TDA Vector Dinámico Tipo de los elementos del vector dinámico typedef int Dato; Estructura de datos del vector typedef struct Vector Dato *datos; // Vector de datos int usado; // Elementos usados del vector int capacidad; // Capacidad del vector ; typedef struct Vector *Vector; Creación del vector (constructor) Vector crearvector (void) Vector v =(Vector) malloc ( sizeof(struct Vector) ); v->usado = 0; v->capacidad = 2; v->datos = malloc ( (v->capacidad)*sizeof(dato) ); return vector; Destrucción del vector (destructor) void destruirvector (Vector *v) free ( (*v)->datos ); free ( *v ); *v = NULL; Constructor y destructor nos permiten manejar vectores sin tener que conocer su estructura de datos interna (ni siquiera tendremos que utilizar malloc y free).

Acceso al contenido del vector Funciones que permiten ocultar los detalles de implementación del TDA Número de elementos del vector: int elementosvector (Vector v) return v->usado; Acceso a los elementos concretos del vector: Obtención del valor almacenado en una posición del vector: Dato obtenerdato (Vector v, int pos) if ((pos>=0) && (pos<elementosvector(v))) return v->datos[pos]; else return NULL; Modificación del valor almacenado en una posición del vector: void guardardato (Vector v, int pos, Dato dato) if ((pos>=0) && (pos<elementosvector(v))) v->datos[pos] = dato;

Inserción de datos void agregardato (Vector v, Dato dato) int i; Dato *datos; if (v->usado == v->capacidad) // Redimensionar el vector v->capacidad *= 2; datos = malloc ( (v->capacidad)*sizeof(dato) ); for (i=0; i < v->usado; i++) datos[i] = v->datos[i]; free(v->datos); v->datos = datos; v->datos[v->usado] = dato; v->usado ++; Eliminación de datos void eliminardato (Vector v, int pos) int i; if ((pos>=0) && (pos<elementosvector(v))) for (i=pos; i<elementosvector(v)-1; i++) v->datos[i] = v->datos[i+1]; v->usado --; OJO! En la implementación mostrada no contemplamos la posibilidad de que la función malloc devuelva NULL (algo que siempre deberemos hacer al programar).

Ejemplo de uso del TDA Vector Dinámico #include <stdio.h> #include vector.h /* Rutina auxiliar */ void mostrarvector (Vector v) int i; printf( "Vector de tamaño %d:\n", elementosvector(v) ); for (i=0; i<elementosvector(v); i++) printf("- %d\n", obtenerdato(v,i)); /* Programa principal */ int main () Vector v = crearvector(); mostrarvector (v); agregardato (v,1); agregardato (v,2); agregardato (v,3); mostrarvector (v); eliminardato (v,1); mostrarvector (v); guardardato (v, 0, obtenerdato(v,0)+2); mostrarvector (v); destruirvector(&v); return 0;