PUNTEROS Y REFERENCIAS

Slides:



Advertisements
Presentaciones similares
DATSI, FI, UPM José M. Peña Programación en C DATSI, FI, UPM José M. Peña Programación en C.
Advertisements

Abstracción de Datos Arrays.
Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
Listas enlazadas c++ Prof. Franklin Cedeño.
Repaso para la construcción del intérprete 2012
Fundamentos de la Programación Estructurada
Programación I Teoría III
Programación I Teoría IV
Direcciones, Arreglos y Argumentos de Funciones
Estructuras de datos. Programación, Algoritmos y Estructuras de Datos.
Tipos de Datos Básicos y Estructurados
INFORMATICA I Arreglos 1 CLASE 17.
Funcionamiento, programación
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Ismael Camarero1. 2 ¿Qué es un PUNTERO?: Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria.
Unidad 3 Punteros.
Ingeniero Anyelo Quintero
Herramientas para el acceso directo a memoria en C++
¿Qué es un PUNTERO?: Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable. No.
Vectores en java.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.

Tema 6: Clases Antonio J. Sierra.
PUNTEROS Ó (apuntadores) EN LENGUAJE C
Diseño de algoritmos “Punteros”
Tema 3 Entrada y Salida.
Lenguaje C.
Semana 5 Subprogramas..
Introducción a los punteros
Capítulo 5. Punteros y Cadenas de Caracteres
Informática Ingeniería en Electrónica y Automática Industrial
Índice. Revisando conceptos acerca de la memoria.
Archivos.
Estructuras.
Informática Ingeniería en Electrónica y Automática Industrial
Clase 10: Estructuras de datos y arreglos.
Descomposición Modular. Funciones
Programación I Técnico Universitario en Web Dpto. de Informática FCFMyN - UNSL -11-
PUNTEROS Ing Anghello Quintero.
Informática Ingeniería en Electrónica y Automática Industrial
Introducción a los punteros Prof. Domingo Hernández.
Unidad II Introducción a la programación en C++
FUNCIONES Conceptos básicos. Retorno de una función Clases de funciones. Paso de parámetros. Funciones y arrays.
TEORIA DE LA INFORMACION INGENIERO ANYELO QUINTERO.
Informática Ingeniería en Electrónica y Automática Industrial
Programación en C para electrónicos
Punteros.
Listas Ligadas Simples. Definíción I  Es, en sencillas palabras. un grupo de datos organizados secuencialmente, pero a diferencia de los arreglos, la.
Elementos básicos del lenguaje
APUNTADORES.
PROGRAMACIÓN MULTIMEDIA
Los punteros Programación modular.
FUNDAMENTOS DE PROGRAMACIÓN
CARACTERÍSTICAS Es un lenguaje de programación estructurado de propósito general. Está estrechamente asociado al sistema operativo UNIX, ya que el propio.
Computación II Capitulo VII Punteros. Presentación de la unidad Objetivos: –Ser capaces de utilizar punteros. –Comprender las relaciones entre punteros,
Contenido:  ¿Qué son los Punteros?  Los Procedimientos: New y Dispose.
Capitulo 4 Arreglos o Arrays Unidimensionales Bidimensionales Strings

LENGUAJE “C” Programación.
ARREGLOS (arrays).
MEMORIA DINÁMICA.
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
PROF. RAFAEL MONTENEGRO B. UNELLEZ-APURE Introducci Ó n a los Arreglos (“arrays”) en C++
Introducción al Lenguaje C (I) Tipos básicos, arrays y punteros Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión
3.6 Manejo de E/S Estructuras En la creación de soluciones para algunos problemas surge la necesidad de agrupar datos de diferente tipo o de manejar datos.
Lenguaje de Programación II Prof. Rafael Montenegro B. Carrera: T.S.U en Informática Periodo: 2014-I.
Computación I :: Prof. Yeniffer Peña Lenguaje C Presentación Computación I.
Transcripción de la presentación:

PUNTEROS Y REFERENCIAS Ing. Betty Suárez Torres

<tipo de dato apuntado> *<identificador de puntero> CONCEPTOS BÁSICOS Un puntero es una variable como cualquier otra, contiene una dirección que apunta a otra posición en memoria, en esa posición se almacenan los datos a los que apunta el puntero, es decir, un puntero apunta a una variable de memoria Declaración de punteros Al igual que cualquier variable, las variables punteros han de ser declaradas antes de utilizarlas. La declaración de una variable puntero debe indicar al compilador el tipo de dato al que apunta el puntero; para ello se hace preceder a su nombre con un asterisco (*), mediante el siguiente formato: <tipo de dato apuntado> *<identificador de puntero> Algunos ejemplos de variables punteros: int* ptrl; //Puntero a un tipo de dato entero (int) long* ptr2; //Puntero a un tipo de dato entero largo (long int) char* ptr3; //Puntero a un tipo de dato char float *f; //Puntero a un tipo de dato float Todos los punteros usan asterisco , para poder usarlo se tiene que declarar .

INICIALIZACIÓN DE PUNTEROS La inicialización de un puntero proporciona a ese puntero la dirección del dato correspondiente. Después de la inicialización, se puede utilizar el puntero para referenciar los datos direccionados. Para asignar una dirección de memoria a un puntero se utiliza el operador de referencia &. por ejemplo: &valor significa «la dirección de valor». El método de inicialización (iniciación), también denominado estático, requiere: Asignar memoria (estáticamente) definiendo una variable y a continuación hacer que el puntero apunte al valor de la variable. int i; //define una variable i int *p; //define un puntero a un entero p p = &i; //asigna la dirección de i a p Asignar un valor a la dirección de memoria: *p = 50 El asterisco delante de la variable puntero indica «e/ contenido de de la memoria apuntada por el puntero y será del tipo dado. No se puede liberar la memoria reservada para una variable. El puntero a esa variable se puede cambiar, pero permanecerá la cantidad de memoria reservada. Como se hace para que el puntero? Al colocar o crear un punteros indica que apunta una direccion (p); para saber en contenido de i se tiene que colocar *p (se muestra contenido) ; la inicializacion es abligatoria

OPERADOR DE DIRECCIÓN & &<var> devuelve la dirección de memoria donde empieza la variable <var>. El operador & se utiliza habitualmente para asignar valores a datos de tipo puntero. int i, *ptri; ptri = &i; i es una variable de tipo entero, por lo que la expresión &i es la dirección de memoria donde comienza un entero y, por tanto, puede ser asignada al puntero ptri. Se dice que ptri apunta o referencia a i. se llama operador de direccion

OPERADOR DE INDIRECCIÓN * *<puntero> devuelve el contenido del objeto referenciado por <puntero>. char c, *ptrc; ptrc = &c; *ptrc = ’A’; // equivalente a c = ’A’ ptrc es un puntero a caracter que contiene la dirección de c, por tanto, la expresión *ptrc es el objeto apuntado por el puntero, es decir, c. Un puntero contiene una dirección de memoria y se puede interpretar como un número entero aunque un puntero no es un número entero. No obstante existen un conjunto de operadores que se pueden realizar sobre un puntero: +,-,++,–, !=, ==

EJEMPLO #include <stdio.h> #include <conio.h> char c; //variable global de tipo carácter void main(){ char *pc; //un puntero a una variable carácter*/ pc = &c; for (c='A';c<='Z';c++){ printf ("%c",*pc) ; } getch(); } La ejecución de este programa visualiza el alfabeto. La variable puntero pc es un puntero a una variable carácter. La línea pc = &c asigna a pc la dirección de la variable c (&c) . El bucle for almacena en c las letras del alfabeto y la sentencia print f ( "%c" , *pc ) ; visualiza el contenido de la variable apuntada por pc. %p se usa como tipo de dato

EJEMPLO Un solo* muestra el valor de memoria de p y no de a por ello tiene que usarse de **q

OPERADORES DE PUNTEROS

ERRORES COMUNES Asignar puntero de distinto tipo int a=10, *ptri; float b=5.0, *ptrf; ptri = &a; ptrf = &b; ptrf = ptri; // Error en compilación Uso de punteros no inicializados Es un error asignar un valor, a un contenido de una variable puntero si previamente no se ha inicializado con la dirección de una variable, o bien se le ha asignado dinámicamente memoria (malloc / new). Por ejemplo: float* px; *px = 23.5; //error, px no contiene dirección Asignación de valores al puntero y no a la variable. int y=5, *nptr =&y; //CORRECTO nptr = 9; //ERROR

#include <stdio.h> void main(){ int n = 75; EJEMPLO #include <stdio.h> void main(){ int n = 75; //visualiza el valor de n printf("n= %d\n",n) ; //visualiza dirección de n printf("&n= %p\n",&n); } Ejecución n = 45 &n = Ox4fffd34 0x4 f f f d3 4 es una dirección en código hexadecimal. “Ox" es el prefijo correspondiente al código hexadecimal.

EJEMPLO #include <stdio.h> #include <conio.h> void main(){ EJECUCIÓN n= 75, %p= 0012FFF6C, p= 0012FFF6C, &p= 0012FF70 #include <stdio.h> #include <conio.h> void main(){ int n = 75; //*p variable puntero, tiene dirección de n int* p = &n; printf("n = %d, &n = %p, p = %p\n",n,&n,p); printf ("&p = %p\n",&p); getch(); } p 0012FFF6C int * 0012FF70 n 75 int

ARREGLOS Y PUNTEROS Un nombre de un array es simplemente un puntero. Supongamos que se tiene la siguiente declaración de un array: int lista[5] = {10, 20, 30, 40, 50}; 1 2 3 4 10 20 30 40 50 lista + 0 lista[0] (*lista) Para apuntar alos otros valores de una lista se puede usar p++ o p+i; lista + 1 lista[1] lista lista + 2 lista[2] lista + 3 lista[3] lista + 4 lista[4]

EJEMPLO int v[0] ; int *p; p = v; (v+4); //apunta al 5" elemento p = p+6; //contiene la dirección del 7º elemento A una variable puntero se le puede aplicar el operador ++, o el operador - - . Esto hace que contenga la dirección del siguiente o anterior elemento: float m[20]; float *r; r = m; r++; //contiene la dirección del elemento siguiente

PUNTEROS A CADENAS Los punteros se pueden utilizar en lugar de índices de arrays. Ejemplo: char alfabeto [27] = “ABCDEFGHIJKLMNOPQRSTUVWXYZ"; Declaremos ahora p un puntero a char char *p; Se establece que P apunta al primer carácter de alfabeto escribiendo p = &alfabeto[0]; //o también p = alfabeto de modo que si escribe la sentencia printf("%c \n", *p) ; se visualiza la letra A, ya que p apunta al primer elemento de la cadena. Se puede hacer también p = alfabeto[15]; de modo que p apuntará al carácter 16º (la letra Q). Sin embargo, no se puede hacer p = &alfabeto; ya que alfabeto es un array cuyos elementos son de tipo char, y se produciría un error al compilar (tipo de asignación es incompatible).

PUNTEROS COMO ARGUMENTOS Cuando se pasa una variable a una función (paso por valor) no se puede cambiar el valor de esa variable. Sin embargo, si se pasa un puntero a una variable a una función (paso por direccición) se puede cambiar el valor de la variable. Ejemplo: Considere la siguiente definición de la función incrementar que incrementa una variable en 5. void Incrementar(int *i){ *i += 5; } La llamada a la función será: int i; i = 10; Incrementar(&i) ;

EJEMPLO CON STRUCT struct temperatura{ float alta; float baja ; }; void registrotemp(struct temperatura *t){ float actual ; leertempactual(actual); if (actual > t -> alta) t - > alta = actual; else if (actual < t -> baja) t -> baja = actual; } La llamada a la función sería: struct temperatura tmp; registrotemp(&tmp);

EJEMPLO #include <stdio.h> #include <conio.h> struct persona{ char nombre [30]; int edad; float altura; int peso; }; typedef struct persona persona; void mostrar_persona(persona *ptr); void main(){ int i; persona empleados [ ] = {{"Juan Perez", 47, 1.82, 85}, {"Luis García", 39, 1.70, 75}, {"Tomás Jimenez",18, 1.75, 80}} ; persona *p; //puntero a estructura p = empleados; for (i = 0; i < 3;i++, p++){ mostrar_persona(p); } getch(); } void mostrar_persona(persona *ptr){ printf ("\nNombre : %s\n",ptr -> nombre) ; printf ("\tEdad: %d\n", ptr -> edad); printf ("\tAltura: %f\n",ptr -> altura) ; printf ("\tPeso: %d\n",ptr -> peso); }

Encuentra los errores en la siguiente declaración de punteros: EVALUACIÓN Encuentra los errores en la siguiente declaración de punteros: int x, *p, &y; char *b = “Cadena larga”; char* c= ‘C’; float x; void *r = &x; &y es de tipo exa decimal;en la dos no inilizamos , no apunta nada, de frente lo estamos declarando; en el siguiente = que la anterior; en la dos ultimas el tipo de dato tiene que ser = al dato que se apunta.