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

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

Curso de Programación en C. Licenciatura, FCQeI. APUNTADORES.

Tema 13: Apuntadores en C

Lenguaje C [Apuntadores y arreglos]

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Elementos de un programa en C

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Laboratorio de Arquitectura de Redes. Punteros en lenguaje C

Programación. Test Autoevaluación Tema 3

Definición de Memoria

Apuntadores (Punteros)

Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez

Lección 2 Introducción al lenguaje C

Tipos de Datos Estructurados

funciones printf scanf

OPERADORES Y EXPRESIONES

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Al concluir está práctica el estudiante será capaz de elaborar programas utilizando apuntadores y arreglos.

Tema 6. Gestión dinámica de memoria

Concepto y manipulación de punteros

Tema 14: Arreglos estáticos en C

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Introducción al lenguaje C

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

El lenguaje C. 1. Identificadores, constantes y variables

Expresiones y sentencias

Algoritmos y Programación I

Apuntadores en C y C++

Práctica de constantes, expresiones y operadores. Programación en C 1

LENGUAJE. Tema 2 Elementos de un programa

Tema 10: Tipos de datos definidos por el usuario

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.

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior PUNTEROS

Tema 2. El lenguaje JAVA

Fundamentos de Programación 2017-I

Ficha de Aprendizaje N 13

Definición y Conversión de datos. Agustín J. González ELO-329

Exterior del algoritmo. Entorno. Usuario. Procesador. Escribir. v1 v2 v3. Leer. <acción> {; <acción>}

EJEMPLOS DE PROGRAMACIÓN DE FUNCIONES EN C: Página 1 de 5

Uso avanzado de punteros

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

Escuela Politécnica Superior de Elche

Lenguaje de programación C. Introducción

Introducción al tipo Vector Cómo guardar una colección de datos conceptualmente relacionados? - almacenar los 100 primeros números primos, - al

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

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Tema 8 Vectores y Matrices

Operadores. Javier Fernández Rivera -

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

TIPOS DE DATOS BASICOS EN LENGUAJE C

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

Informática Ingeniería en Electrónica y Automática Industrial

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

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

TEMA 8: Gestión dinámica de memoria

Tema 8 Punteros. Fundamentos de Informática

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Tema: Sobrecarga de Operadores.

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

EXAMEN PARCIAL TRABAJO INTEGRADOR (TI) EVALUACIÓN CONTINUA PESO PORCENTUAL PESO PORCENTUAL 1 30% 06-MAY-14 30% 03-MAY-14 20% 20%

INICIACIÓN A LA PROGRAMACIÓN EN C

Introducción a variables de tipo Puntero (Apuntadores) Contenidos. 1. Introducción a las variables puntero 2. Repaso:

Operadores y Expresiones

Cadenas y Caracteres. Universidad Católica de Honduras Nuestra Señora Reina de la Paz. Asignatura. Programación Científica. Tema de Exposición

Curso de Programación Avanzada en C

Principios de Computadoras II

Constantes. Las constantes no cambian durante la ejecucion de un programa en C++, en C++ existen 4 tipos de constantes:

FUNDAMENTOS DE INFORMÁTICA

1. Sobrecarga de operadores. 2. Métodos operadores unarios Operador de incremento (prefijo)

Tema: Repaso sobre uso de Funciones, Arreglos y Punteros en C++.

4. Operadores Operador asignación

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

Introducción a los Computadores

Programación En Lenguaje C

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Fundamentos de programación

7. Manejo de Archivos en C.

Punteros, Arreglos y Cadenas en C

Principios de Computadoras II

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Computación II. Introducción a Visual Basic

Programación I. Arreglos. Prof. Lisbeth Pérez Rivas

Resumen de Sintaxis en C

Unidad II Fundamentos de C++ M.C. Juan Carlos Olivares Rojas

Introducción a Lenguaje C. Jornadas de Octubre 2009 Grupo de Usuarios de Linux Universidad Carlos III Tania Pérez

TIPO DE DATO ABSTRACTO (TDA)

Caracteres y Cadenas Conversión de Datos Funciones y procedimientos Archivos cabecera. Fundamentos de programación

PROGRAMACION ORIENTADA A OBJETOS EN C++

EQUIVALENCIAS EN C DE CONSTRUCCIONES SECUENICIALES EN PSEUDOCÓDIGO

En este artículo vamos a conocer los tipos de datos que podemos manejar programando en C.

2. EXPRESIONES 3. OPERADORES Y OPERANDOS 4. INDENTIFICADORES COMO LOCALIDADES DE MEMORIA

Programación en java. Estructuras algorítmicas

Tema 3 SUBRUTINAS. Estructura de Computadores OCW_2015 Nekane Azkona Estefanía

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

Informática Ingeniería en Electrónica y Automática Industrial

Transcripción:

Los punteros en C 1 Introducción Cómo se organiza la memoria asociada a un programa? Como una colección de posiciones de memoria consecutivas. En ellas se almacenan los distintos tipos de datos, que ocupan, por ejemplo: 1 char = 1 byte 1 int = 2 bytes 1 float = 4 bytes Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria. Los punteros, por lo tanto, guardan en dos, cuatro ó n posiciones de memoria, la dirección de un conjunto de celdas.

p c donde: p es un puntero a carácter char *p; c es una variable de tipo carácter char c; Inicialmente un puntero no apunta a ningún sitio. En C el valor NULL se reserva para indicar que el puntero está vacío (equivalente al nil de la teoría). Operadores asociados a punteros &: operador dirección: me da la dirección de un objeto en la memoria. Sólo sirve para posiciones de memoria (puede apuntar a variables o a vectores, pero no a constantes o expresiones). Ejemplo: /* Prog1.c */ p = &c;

*: operador indirección: me da el contenido de una posición de memoria (generalmente almacenada en un puntero). Es el equivalente al operador del código algorítmico: printf ( \nno tiene lo mismo %c que %ld, c, p); printf ( \ntiene lo mismo %c que %c, c, *p); Un puntero siempre está asociado a objetos de un tipo: sólo puede apuntar a objetos (variables o vectores) de ese tipo. int *ip; /* Sólo puede apuntar a variables enteras */ char *c; /* Sólo puede apuntar a variables carácter */ double *dp, /* dp sólo puede apuntar a variables reales */ float atof (char *); /* atof() es una función que devuelve un real dada una cadena que se le pasa como puntero a carácter*/

Los operadores * y & son unarios y tienen más prioridad a la hora de evaluarlos que los operadores binarios. /* Mirar prog2.c*/ *ip = *ip + 10; printf ( \n y=%d, *ip=%d, ip=%ld, y, *ip, ip); y = *ip + 10; printf ( \n y=%d, *ip=%d, y, *ip); *ip += 1; printf ( \n y=%d, *ip=%d, y, *ip); Es necesario utilizar paréntesis cuando aparezcan en la misma expresión que otros operadores unarios como ++ o --, ya que en ese caso se evaluarían de izquierda a derecha (*ip)++; printf ( \n y=%d, *ip=%d, y, *ip); *ip++; printf ( \n y=%d, *ip=%d, y, *ip); Dado que los punteros son variables, también pueden usarse como asignaciones entre direcciones. Así: int *ip, *iq; iq = ip; Indica que iq apunta a donde apunte el puntero ip.

2. Los punteros y los argumentos a funciones Código Algorítmico Equivalente C Ejemplo parámetro dato paso por valor int scanf (const char *, <arg>) parámetro resultado paso por referencia / valor int scanf (const char *, <arg>) devuelto por una función parámetro dato-resultado paso por referencia scanf ( %d, &entero); En C, por defecto, todos los parámetros a las funciones se pasan por valor (la función recibe una copia del parámetro, que no se ve modificado por los cambios que la copia sufra dentro de la función). Ejemplo: Intercambio de dos valores {véase uso_punteros+intercambia.c} {VERSION ERRONEA} intercambia_mal (int a, int b) { int tmp; tmp = a; a = b; b = tmp;} {VERSION CORRECTA} intercambia_bien (int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; }

Para que un parámetro de una función pueda ser modificado, ha de pasarse por referencia, y en C eso sólo es posible pasando la dirección de la variable en lugar de la propia variable. Si se pasa la dirección de una variable, la función puede modificar el contenido de esa posición (no así la propia dirección, que es una copia). 3 Punteros y vectores En C los punteros y los vectores están fuertemente relacionados, hasta el punto de que el nombre de un vector es en sí mismo un puntero a la primera (0-ésima) posición del vector. Todas las operaciones que utilizan vectores e índices pueden realizarse mediante punteros. int v[10]; 1 3 5 7 9 11 13 15 17 19 v[0] V[1] v[2] v[3] v[4] v[5] v[6] v[7] v[8] v[9]

int v[10]; /* designa 10 posiciones consecutivas de memoria donde se pueden almacenar enteros */ int *ip; /* Designa un puntero a entero */ ip, es un puntero y, por lo tanto, permite acceder a una posición de memoria. Sin embargo, como se ha dicho antes v también puede considerarse como un puntero a entero, de tal forma que las siguientes expresiones son equivalentes: ip = &v[0] x = *ip; *(v + 1) v + i ip = v x = v[0]; v[1] &v[i]

4 Aritmética de punteros El compilador C es capaz de adivinar cuál es el tamaño de una variable de tipo puntero y realiza los incrementos/decrementos de los punteros de la forma adecuada. Así: int v[10], *p; p = v; /* p Apunta a la posición inicial del vector*/ /* p + 0 Apunta a la posición inicial del vector*/ /* p + 1 Apunta a la segunda posición del vector*/ /* p + i Apunta a la posición i+1 del vector */ p = &v[9]; /* p apunta ahora a la última posición (décima) del vector */ /* p - 1 Apunta a la novena posición del vector*/ /* p - i Se refiere a la posición 9 - i en v*/

Ejemplo de recorrido de un vector utilizando índices y punteros. /* prog3.c (revisar la versión extendida de este programa)*/ main(){ int v[10]; int i, *p; for (i=0; i < 10; i++) v[i] = i; /* Asignamos valores iniciales*/ for (i=0; i < 10; i++) printf ("\n%d", v[i]); p = v; for (i=0; i < 10; i++) printf ("\n%d", *p++); /* Tras cada p++ el puntero señala a la siguiente posición en v */ }

C realiza las mismas operaciones con independencia del tipo de la variable. De esta forma, si tenemos dos variables que son punteros: int *ip, vi[10]; /* Necesita dos posiciones para representar un entero */ char *cp, vc[10]; /* Necesita una posición para representar un carácter */ ip = &vi[0]; cp = &vc[0]; Las expresiones: ip + 1, ó ip++ cp + 1, ó cp++ Apunta al siguiente elemento (dos posiciones): vi[1] Apunta al siguiente elemento (una posición): vc[1]

Diferencia entre puntero y nombre de vector: Mientras que un puntero es una variable y puede intervenir en asignaciones o incrementos, el nombre del vector no es una variable, por lo tanto, no pueden realizarse operaciones del tipo: int v[10], *a; v = a; /* no permitido */ v++; /* no permitido */ Dado que el nombre del vector es un puntero, puede utilizarse para pasar un vector como parámetro de una función (lo que permite modificar el contenido de esas posiciones de memoria adyacentes, o lo que es lo mismo, los elementos del vector). char palabra[10]; scanf ( %s, palabra); /* Modifica las posiciones de memoria */ sort (palabra, 0, strlen(palabra));

/* sort va a modificar el contenido del vector, ordenándolo por cualesquiera de los métodos que se presenten en clase; por lo tanto se pasará la dirección del primer elemento = palabra = &palabra[0]. strlen es una función de la biblioteca estándar, cuyo macro es: int strlen (char *) La función nos devuelve la longitud de un vector de caracteres */ Recordatorio: Los vectores de caracteres terminan en el carácter \0. Ejemplo 1: Realícese una función que sea equivalente a strlen. int longitud (char * s) Ejemplo 2: Realizar una función equivalente que permita realizar a := b, cuando ambas son cadenas. copia (char * a, char * b)