Laboratorio de Arquitectura de Redes. Punteros en lenguaje C

Documentos relacionados
Apuntadores (Punteros)

Elementos de un programa en C

Tema 13: Apuntadores en C

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

Tema 2. El lenguaje JAVA

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

TEMA 8: Gestión dinámica de memoria

Tema 14: Arreglos estáticos en C

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

Lección 2 Introducción al lenguaje C

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

OPERADORES Y EXPRESIONES

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

El lenguaje C. 1. Identificadores, constantes y variables

Lenguaje C [Apuntadores y arreglos]

Programación. Test Autoevaluación Tema 3

Tipos de Datos Estructurados

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.

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

Curso de Programación Avanzada en C

Apuntadores en C y C++

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Java para programadores

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

Algoritmos y Programación I

TIPOS DE DATOS BASICOS EN LENGUAJE C

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

funciones printf scanf

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

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

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

Parte I: Elementos del lenguaje Ada

Expresiones y sentencias

Tema 8 Vectores y Matrices

Punteros, Arreglos y Cadenas en C

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

PHP: Lenguaje de programación

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

Arrays. Programación. Licenciatura de Lingüística y Nuevas Tecnologías

2.2 Nombres, Ligado y Ámbito

Programación estructurada (Introducción a lenguaje C)

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos

Tema 10: Tipos de datos definidos por el usuario

Concepto y manipulación de punteros

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

Instituto Tecnológico de Celaya

Programación En Lenguaje C

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

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

Programación I Unidad III. Tema: Tipos, estructuras y uniones

Elementos léxicos del lenguaje de programación C

Es toda la información que utiliza el computador. Según sea la información que guardemos en los datos, se clasifican en los siguientes tipos:

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

Tabla de Símbolos. Programación II Margarita Álvarez

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

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

Uso avanzado de punteros

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

Escuela Politécnica Superior de Elche

Programación en java. Estructuras algorítmicas

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

LENGUAJE. Tema 2 Elementos de un programa

Tema 4. Operadores y Expresiones

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

media = ( temp0 + temp1 + temp2 + temp3 + temp temp23 ) / 24; printf( "\nla temperatura media es %f\n", media );

Práctica 1 de Excel (Curso )

Computación II. Introducción a Visual Basic

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

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

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

Lenguaje de programación C. Introducción

Capítulo 7 OPERADORES Y EXPRESIONES. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"

PROGRAMACION ORIENTADA A OBJETOS EN C++

Universidad Don Bosco (UDB) Facultad de Ingeniería / Escuela de Computación

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

Definición de Memoria

Operadores y Expresiones

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

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

TALLER DE EXCEL BÁSICO

Ficha de Aprendizaje N 13

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

Tema 6. Gestión dinámica de memoria

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

Principios de Computadoras II

Lenguaje C Estructuras y Variables definidas por el Usuario.

CONCEPTOS BASICOS DEL LENGUAJE JAVA

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

Manual de turbo pascal

Un identificador le da nombre único a un elemento en un programa (Variables, procedimientos, etc.). No puede contener operadores como + - * /

Principios de Computadoras II

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

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

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

Variables. Profesor Leonardo Carámbula - Programación III EMT I.S.B.O.

INTRODUCCIÓN AL LENGUAJE C

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

Vamos a profundizar un poco sobre los distintos tipos de datos que podemos introducir en las celdas de una hoja de cálculo

Operadores. Javier Fernández Rivera -

El lenguaje C. 1. Estructuras. Principios de Programación Definicion de estructuras

Transcripción:

Laboratorio de Arquitectura de Redes Punteros en lenguaje C

Punteros en lenguaje C Definición Declaración e inicialización de punteros Operadores de punteros: «*» y «&» Operaciones con punteros Operaciones de asignación Artimética de punteros Tipos de punteros Genéricos Nulos Constantes Relación entre punteros y arrays Puntero a un array Arrays de punteros Puntero a un puntero Punteros a estructuras y uniones Laboratorio de Arquitectura de Redes 2

Definición de puntero (I) Un puntero es una variable que contiene la dirección de memoria de otra variable Por eso se dice que un puntero apunta a una variable Se trata de una indirección: se puede acceder a la variable indirectamente Los punteros constituyen una importante herramienta en lenguaje C Proporcionan acceso rápido y eficiente a los arrays Facilitan el trabajo con listas enlazadas Facilitan el intercambio de información entre funciones Son imprescindibles para Asignar memoria dinámicamente El trabajo con archivos En el manejo de los punteros hay que extremar las precauciones para evitar errores de muy difícil localización Laboratorio de Arquitectura de Redes 3

Definición de puntero (II) Variables de tipo int: dato1 y dato2 Variables puntero a entero: puntdat1 y pundat2 Memoria de datos Etiqueta dato1 dato2 puntdat1 puntdat2 Dirección 0x0F00 0x0F04 0x0F08 0x0F0C Contenido 1234 6789 0F00 0F04 Laboratorio de Arquitectura de Redes 4

Declaración e inicialización de punteros (I) La declaración de una variable puntero asigna la memoria necesaria para almacenar una dirección tipodato *nombrepuntero; tipodato es el tipo de dato de la variable a la que apuntará el puntero. nombrepuntero es la etiqueta de la zona de memoria que contendrá la dirección de una variable *nombrepuntero hace referencia al contenido de la variable apuntada por el puntero No se crea ni se reserva memoria para la variable a la que va a apuntar El tamaño de la memoria necesaria para almacenar una dirección es siempre el mismo, independientemente del tipo de dato al que corresponda esa dirección Laboratorio de Arquitectura de Redes 5

Declaración e inicialización de punteros (II) Inicializar un puntero consiste en hacerle apuntar a una variable válida La variable debe existir antes de la inicialización Que la variable exista no significa que deba contener un dato válido tipodato *punt; /* Declaración del puntero*/ tipodato var; /* Declaración de la variable */ punt = &var; /* Inicialización del puntero /* La variable var no contiene todavía ningún dato válido */ Laboratorio de Arquitectura de Redes 6

Declaración e inicialización de punteros (III) Ejemplo float *punt; /* Puntero */ float var; /* Variable */ /* La variable y el puntero deben ser el mismo tipo de dato */ punt = &var; /* Inicialización del puntero */ *punt = 7.98; /* Inicialización de la variable. Es igual que escribir var = 7.98: */ Una declaración de la forma int *punt=25; hace que el puntero apunte a la dirección 25 que no sabemos qué contiene Laboratorio de Arquitectura de Redes 7

Operadores de punteros: «*» y «&» Los operadores de punteros son «*» y «&» Se asocian de derecha a izquierda Tienen mayor precedencia que todas las operaciones aritméticas y lógicas El operador «&» devuelve la dirección de memoria de su operando Aplicado a una variable hace referencia a la dirección de esa variable Sólo puede aplicarse a identificadores de variables y elementos de arrays, no es válida sobre expresiones El operador «*» devuelve el dato almacenado en la dirección representada por el identificador sobre el que actúa Sólo tiene sentido sobre variables que contienen una dirección de memoria válida (punteros) Aplicado a una variable puntero permite utilizar esa expresión como una variable cualquiera, sin limitaciones Laboratorio de Arquitectura de Redes 8

Operaciones con punteros (I) Las operaciones con punteros son operaciones con direcciones de memoria Sólo tienen sentido la suma, la resta, incrementos y decrementos Operaciones de asignación Es posible asignar el contenido de un puntero a otro puntero Lo que se consigue es hacer que ambos punteros apunten a la misma posición de memoria Deben ser del mismo tipo Ejemplo int dato, *punt1, *punt2; /* Declaraciones */ punt1 = &dato; /* Inicialización de punt1 */ punt2 = punt1; /* asignación del contenido de punt1 a punt2. Ahora punt2 apunta a la variable dato */ Laboratorio de Arquitectura de Redes 9

Operaciones con punteros (II) Aritmética con punteros: La suma de un número entero n a un puntero hace que este apunte al enésimo elemento del mismo tipo a partir del originalmente apuntado. La resta de un número entero n a un puntero hace que este apunte al elemento n-veces anterior al que apuntaba Independientemente de que el dato al que se traslada el puntero exista o no. Los incrementos o decrementos de un puntero hacen que este apunte al elemento siguiente o anterior del mismo tipo. En valor numérico absoluto, el incremento o decremento de un puntero cambia su valor un número de unidades que depende del tipo de dato al que apunta La aritmética de punteros sólo coincide con la aritmética ordinaria cuando se opera con punteros que apunten a elementos de tipo byte Son posibles las comparaciones y las operaciones lógicas con punteros siempre que se realicen entre punteros del mismo tipo de dato Laboratorio de Arquitectura de Redes 10

Tipos de punteros Puntero genérico es aquel que no apunta a ningún tipo de dato void *nombrepuntero; Se declaran así para que posteriormente se les pueda hacer a puntar a cualquier tipo de dato. Puntero nulo es aquel que no apunta a ningún dato tipodato *nombrepuntero = NULL; NULL es una constante definida en stdio.h Se utiliza para indicar situaciones de error Puntero constante es aquel que se declara como tal y, por tanto, siempre apunta a la misma posición tipodato *const nombrepuntero; El contenido, el dato apuntado, si puede cambiar Si es el dato lo que se declara como constante se escribe const tipodato *nombrepuntero; Si el puntero y el dato al que apunta se declaran constantes const tipodato *const nombrepuntero; Laboratorio de Arquitectura de Redes 11

Relación entre punteros y arrays (I) En general: todo lo que puede hacerse con arrays puede hacerse también con punteros Las versiones con punteros son más rápidas y más utilizadas El identificador de un array (sin índice) es un puntero constante al primer elemento del array En un array de N elementos, se puede acceder al elemento M (tal que 0 M N) Mediante arrays elementom = nombrearray[m]; Mediante punteros elementom = *(nombrearray+m); Laboratorio de Arquitectura de Redes 12

Relación entre punteros y arrays (I) Un puntero a un array de caracteres o un puntero a una cadena es un puntero a carácter que apunta al primer elemento de la cadena Se puede inicializar en la declaración: char *nombrepuntero = cadena ; nombrepuntero es un puntero a carácter: contiene la dirección del primer elemento de la cadena Si en el transcurso del programa, se le hace apuntar a otro sitio, ya no será posible volver a apuntar a la posición original cadena es una cadena constante que se almacena en una tabla de constantes. Finaliza con el carácter nulo \0 Cuando a una función se le pasa como argumento una constante de cadena (cadena de caracteres entre comillas dobles), en realidad se le pasa un puntero al primer elemento de esa cadena char *mensaje = Error de lectura ; puts(mensaje); Laboratorio de Arquitectura de Redes 13

Relación entre punteros y arrays (II) Un array de punteros se declara del siguiente modo tipodato *nombrevariable = [tamaño]; tipodato es el tipo de datos de los elementos que serán apuntados. nombrevariable es el nombre del array de punteros tamaño indica el número de punteros que contendrá el array El array de punteros contiene elementos que son direcciones Cada dirección apuntará a un dato del tipo declarado. Es preciso inicializar todos los punteros del array (hacerles apuntar a un tipo de dato válido Un array de punteros a carácter es similar a un array bidimensional o a un array de cadenas Laboratorio de Arquitectura de Redes 14

Relación entre punteros y arrays (III) ARRAY DE PUNTEROS Datos en memoria Dato 1 Nombre del array Puntero 1 Puntero 2 Puntero 3 Puntero 4 Puntero 5 Dato 2 Dato 3 Dato 4 Dato 5 Laboratorio de Arquitectura de Redes 15

Relación entre punteros y arrays (IV) Ejemplo Array bidimensional de caracteres char mens[3][80] = { Inicial, Central, Último }; /* Array de 3 cadenas. Se reserva más memoria de la necesaria para que quepan todos los mensajes */ puts(mens[1]); /* Saca el mensaje Central */ Array de punteros a carácter char *mens[3]; /* Array de 3 punteros a carácter */ mens[0]= Inicial ; /* Inicialización de punteros */ mens[1]= Central ; mens[2]= Último ; puts(mens[1]); /* Casa el mensaje Central */ Laboratorio de Arquitectura de Redes 16

Puntero a un puntero Un puntero a puntero representa una indirección múltiple: el primer puntero contiene la dirección del segundo puntero, el cual apunta al dato tipodato **nombrepuntero; nombrepuntero contiene la dirección de *nombrepuntero que, a su vez, contiene la dirección de **nombrepuntero **nombrepuntero es el identificador del dato Un puntero a puntero es equivalente al nombre de un array bidimensional Si datos[m][n] es un array bidimensional, el elemento datos[i][j] puede accederse también mediante la aritmética de punteros: *(*(datos+i)+j) Laboratorio de Arquitectura de Redes 17

Punteros a estructuras y uniones Para declarar un puntero a una estructura o a un unión, el tipo de estas debe estar previamente definido Declaración de un puntero a una estrucutra struct tipoestructura *nombrepuntero; union tipounion *nombrepuntero; tipoestructura o tipounion representan el tipo de estructura o de unión ya definido Para acceder a los elementos de una estructura o de una unión a través de su puntero se utiliza el operador flecha «- >» formado por los signos menos y mayor que «>» en ese orden nombrepuntero->nombrelemento El operador flecha (con punteros) equivale al operador punto con identificadores ordinarios La referencia a un miembro de una estructura o una unión a través de un puntero puede utilizarse sin restricciones como un identificador ordinario Laboratorio de Arquitectura de Redes 18