[ ] Informática PRÀCTICA 9 Curs 2002-2003 Departament d’Informàtica Departamento de Informática FACULTAT DE MATEMATIQUES UNIVERSITAT DE VALENCIA Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros Objetivos de la práctica: - Entender la representación de números (enteros y reales) en el ordenador. - Comprobar los rangos de representación y la precisión en las operaciones con números. - Introducir el concepto básico de punteros. - Conocer la entrada y salida en C (printf y scanf). - Entender el funcionamiento y el uso de punteros para simular el paso por referencia en C. Rangos y precisión de la representación numérica en el ordenador. • Tipo entero: Almacenan números enteros. • Ø Sintaxis: short 2 bytes (-32768..0..32767) Ø Sintaxis: long 4 bytes (-2147483648..0..2147483647) Ø Sintaxis: int 4 bytes (-2147483648..0..2147483647) Tipo real: Almacenan números reales en coma flotante. Ø Sintaxis: float (simple precisión) 4 bytes (3.4E-38...3.4E+38) Ø Sintaxis: double (doble precisión) 8 bytes (1.7E-308..1.7E+308) Punteros Un puntero es un tipo de dato que es capaz de guardar una dirección de memoria. Las direcciones de memoria sirven al ordenador para saber en qué lugar de la memoria se sitúa exactamente una determinada información, y en general cualquier variable lleva asociada una dirección de memoria. Se llama puntero porque podemos pensar que la dirección “apunta” a la variable. Definición de una variable de tipo puntero: char *p_caracter; int *p_entero; // Variable puntero que apunta a una variable de tipo carácter // Variable puntero que apunta a una variable de tipo entero Los operadores básicos con punteros son: & Obtiene la dirección de memoria en donde se encuentra una variable, a partir del nombre de la variable. * Obtiene el contenido (valor) que se guarda en una determinada posición de memoria. new Crea una variable dinámica del tipo especificado y devuelve un puntero que apunta a esta nueva variable. Ej: int *n; n = new int(17); // Inicializa la variable n a 17 delete Libera el espacio reservado para una información (le dice al ordenador que ese espacio puede ser utilizado por otros usuarios.) Ej: delete p; // Elimina la variable a la que apunta p Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros 1/5 [ ] Informática PRÀCTICA 9 Curs 2002-2003 Departament d’Informàtica Departamento de Informática FACULTAT DE MATEMATIQUES UNIVERSITAT DE VALENCIA Operaciones con punteros: 1.- Obtener la dirección de una variable y asignar esta dirección a una variable de tipo puntero (trabaja con direcciones de memoria). char x, *puntero_x; puntero_x = &x; /* Variable puntero_x tenemos guardada la dirección de la variable x */ 2.- Podemos asignar el valor de una variable puntero a otra variable de tipo puntero: char *p1, *p2; p1 = p2; /* El puntero p1 y el puntero p2 almacenan la misma dirección de memoria */ *p1 = *p2; /* Los contenidos contenidos */ de las variables p1 y p2 son los mismos, asignación de Funciones de Entrada y Salida Estándar en C Incluir el fichero de cabecera #include<stdio.h>, dentro de él se encuentran declaradas las funciones de E/S. (Nota: en las prácticas anteriores usabais la cabecera #include <iostream.h> para utilizar las funciones de entrada y salida de C++). Funciones de Salida Estándar printf ( <cadena de caracteres>, [<dato>, <dato>,...] ) Esta es una función que permite escribir en pantalla varios datos de cualquier tipo insertados dentro de una cadena de texto. La cadena de caracteres incluye especificaciones de formato sobre la manera en que han de ser representados los datos. Tabla de especificadores de formato para el printf: Código %c %d %i %x %X %o %u %ld %lx %lo %lu %f %e %E %g Argumento Salida resultante char short, int short, int short, int short, int short, int unsigned short,unsigned int long long long unsigned long float, double float, double float, double float, double muestra un carácter muestra un entero como número decimal con signo. muestra un entero como número decimal con signo. muestra un entero en forma hexadecimal. muestra un entero en forma hexadecimal (letras may.). muestra un entero en forma octal. muestra un entero sin signo como número decimal. muestra un entero largo como número decimal. muestra un entero largo en forma hexadecimal. muestra un entero largo en forma octal. muestra un entero largo sin signo como num. decimal. muestra un número real en formato punto flotante. muestra un número real en formato exponencial. muestra un número real en formato exponencial. seleciona automáticamente entre los formatos %f y Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros 2/5 [ Departament d’Informàtica Departamento de Informática ] Código Argumento Informática PRÀCTICA 9 Curs 2002-2003 FACULTAT DE MATEMATIQUES UNIVERSITAT DE VALENCIA Salida resultante %e. %G float, double seleciona automáticamente entre los formatos %f y %E. %s cadena puntero %p muestra una cadena de caracteres. muestra el valor de un puntero. muestra el carácter %. %% Modificadores del especificador de formato : %<ancho>.<digitos>F Secuencias de escape El carácter \ es el llamado carácter de escape, y se le llama secuencia de escape al conjunto formado por la \ y el(los) siguiente(s) carácter(es) que lo siguen. Tabla de secuencias de escape: Secuencia Significado Secuencia Significado \n \’ Salto de línea y retorno de carro escribe el carácter de comillas simples (‘) \r \” Sólo retorno de carro escribe el carácter de comillas dobles (“) \f \xdd escribe el carácter cuyo código ASCII en Solo salto de línea hexadecimal es dd \b \ddd Retrocede un carácter escribe el carácter cuyo código ASCII en octal es ddd \t \\ Escribe un tabulador escribe el carácter \ \a Hace sonar una campanilla Ejemplo: #include <stdio.h> void main ( void ) { int num; double pi = 3.145926; char cr = ‘!’; num = -1997; printf(“El numero printf(“Usando el printf(“Usando el printf(“Usando el printf(“Usando el printf(“Usando el es %d y PI es %f\n”, num, pi ); modificador 15d sale : %15d!\n”, num ); modificador -10d sale : %-10d%c\n”,num,’!’ ); modificador 012d sale : %012d%c\n”,num,cr); modificador .2f sale : %.2f!\n”, pi ); modificador 6.13f sale : %6.13f%c\n”,pi,cr ); } Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros 3/5 [ ] Departament d’Informàtica Departamento de Informática Informática PRÀCTICA 9 Curs 2002-2003 FACULTAT DE MATEMATIQUES UNIVERSITAT DE VALENCIA Funciones de Entrada Estándar Se utilizan para leer datos a través de la entrada estándar (normalmente el teclado del ordenador). En estas tres funciones, la entrada se hace usando un buffer. Esto quiere decir que, cada vez que utilizamos una de estas funciones, los caracteres que representan las teclas que pulsamos se introducen dentro del buffer y sólo están disponibles para nuestro programa después de pulsar el INTRO (el carácter de INTRO también queda almacenado dentro del buffer). scanf( <cadena de formato>, <dirección>, <dirección>,...) Lee caracteres del buffer de entrada y los interpreta según la cadena de formato, guardándolos en las direcciones de las variables indicadas en los siguientes parámetros. Recordemos que una variable tiene asignada una dirección de memoria donde guarda sus valores, dirección que asigna el compilador automáticamente durante la declaración. Para las variables, que no sean cadenas de caracteres, la dirección se obtiene precediendo el nombre de la variable con el operador &. Tabla de especificadores de formato para el scanf: Código Significado %c Lee un carácter Código %d %o Lee un entero decimal Lee un entero decimal %i %x %f Significado Código Significado Lee un entero en %lf lee un número real doble hexadecimal %p Lee un entero en octal lee un puntero %s lee un número real simple lee una palabra #include <stdio.h> void main ( void ) { char letra1, letra2; char tira[100]; int a, b, cuantos; b = 5; printf ( "Pulsa dos tecla para getchar " ); letra1 = getchar ( ); letra2 = getchar ( ); printf ( "Pulsaste %c y %c\n", letra1, letra2 ); getchar(); printf ( "\nEscribe tu nombre y apellidos: " ); gets ( tira ); printf ( "Te llamas %s\n", tira ); printf("\nEscribe dos números: " ); cuantos = scanf ( "%d %d", &a, &b ); printf ( "Número de datos leídos %d. Ahora a = %d y b = %d\n", cuantos, a, b ); } Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros 4/5 [ ] Departament d’Informàtica Departamento de Informática Informática PRÀCTICA 9 Curs 2002-2003 FACULTAT DE MATEMATIQUES UNIVERSITAT DE VALENCIA Paso por referencia en C En realidad, en el C no existe el paso por referencia como hemos visto en C++; todos los argumentos se pasan por valor. Sin embargo, existe una forma de simular el paso por referencia: utilizando punteros. ¿ Cómo se realiza este paso de parámetros por referencia en C?: 1.- Cuando pasamos argumentos por referencia, en la llamada utilizamos la referencia (dirección) de la variable y no su valor. Para ello precedemos el nombre de la variable con el operador dirección “&“. 2.- Cuando definimos el parámetro por referencia, tenemos que marcarlo con un “*” delante del nombre, para que el compilador sepa que este parámetro esta preparado para recibir referencias (direcciones) a variables y compartir así su valor. Práctica Nº 9: Rango y precisión de representación de números en el ordenador. Uso de punteros 5/5