Home
Username:
Password:
C Programming (Español) Tutorials

Apuntadores Básicos / Soluciones del Capítulo 13




Visitors to VTC.com will be able to view all introductory videos for each training course.
Free Trial Members will gain access to first three chapters for each training course.
Full Access Members have full access to VTC.com’s entire library of video tutorials.


Learn More

Subtitles of the Movie

Estas son las soluciones del capitulo 13. ÀFue dificil? Veamos la primera pregunta que he formulado. ÀQue significa la linea "typedef int *int_p"? Esta crea un nuevo tipo mediante la sentencia "typedef". En este caso, el nuevo tipo es un apuntador a un entero llamado "int_p". Esta es una linea bastante confusa. ÀUsted pudo descifrarla? La siguiente linea "int_p p" declara una variable llamada "p" de ese tipo. Es decir, "p" sera un apuntador a un entero. Observe que "p" es un apuntador aunque en esta declaracion no tenemos un asterisco. Tal vez usted piense que debe haber un asterisco en la declaracion de un apuntador, pero no es asi, al menosÉ si hemos utilizado la palabra "typedef" para declarar el tipo. El asterisco es un parte de la declaracion, pero este proviene de la linea "typedef". Esto es un poco confuso. Ese es el significado de estas dos lineas de codigo. Veamos ahora el codigo de las soluciones a los ejercicios formulados. Este es el archivo "pointers.c" de la carpeta "Solutions". Vamos a utilizar este programa para solucionar los dos ejercicios relacionadosÉ con las funciones "my_scanf" y "print_int_ptr". Estos estan desarrollados en este codigo fuente en particular. Primero veamos la funcion "print_int_ptr". Esta toma como unico parametro la direccion de un entero y luego la despliega en la pantalla. Es muy sencilla. Se que debio ser dificil hacerlo asi, pero el resultado es bastante sencillo, pues simplemente desplegamos la direccion, la cual podemos ver como un enteroÉ o como un numero extenso. Aqui desplegamos el valor de la direccion que tambien es un entero, pues este es un apuntador a un numero entero, es decir, el contenido de "p", el elemento al cual "p" apuntaÉ o el valor del elemento al cual "p" apunta, dependiendo de como queramos decirlo. Asi desplegamos el contenido del apuntador "p". Vamos a verificarlo. Mas adelante veremos la funcion "my_scanf", en la cual desplegamos "Please enter a number" seguido por el numero ingresado. Ejecutamos, ingresamos el numero 34 y obtenemos varios resultados. Parece que la funcion "my_scanf" se ejecuta correctamente, pues obtenemos que el valor de la direccion es 34. Tambien obtenemos el valor del entero "x". Voy a arrastrar esta ventana para verlo. El entero "x" contiene el valor 34, lo cual es muy claro. Este es el valor de la direccion "x": 39 millones, 58 mil 900. Al pasar la direccion de ese entero "x" a la funcion "print_int_ptr", esta es desplegada junto al valor en si. ÀQue ocurriria si solo pasamos el valor de "x" en vez de su direccion? ÀY si hacemos que la funcion "print_int_ptr" no requiera un apuntador a un entero como parametroÉ sino solo el valor entero? Obviamente aun asi obtendriamos el valor 34, pero Àla direccion seria la misma o seria diferente? Digamos que sabemos como desplegar tambien la direccion de ese parametro. No es dificil, pues podemos simplemente ejecutar una sentencia "printf" y el numero desplegado seria la direccion del parametro, es decir, "¶meter". La pregunta es: Àesta seria la misma direccion? La respuesta es noÉ porque este es un parametro diferenteÉ y no es igual a "x". El parametro es un duplicado, asi que esta seria la direccion de un duplicado y no de la variable "x" original. Ahora veamos la funcion "my_scanf". Aqui la tenemos. Para que funcione, simplemente le pasamos el entero que queremos leer. Al igual que la funcion "scanf", debemos incluir un ampersand donde queramos leer un entero desde el teclado. Debemos hacer lo mismo con la funcion "my_scanf". No podemos solo pasarle el valor de "x" porque la funcion no podria modificarlo. Recuerde que las funciones no pueden modificar sus parametros. Por lo tanto, debemos pasarle la direccion de "x". Este es el parametro. que es un apuntadorÉ llamado "the_int". Este no es un nombre muy imaginativo, pero es el unico que se me ocurrio. Pude haberlo llamado "pointer" o un nombre similar, pero quiero dejar claro que este corresponde a un valor entero. Aunque este es un apuntador, quiero que piense en el como un entero. Lo pasamos a la funcion "scanf" y observe que aqui no utilizamos un ampersand. ÀUsted lo intento asi o penso que siempre que utilizamosÉ la funcion "scanf" debemos incluir un ampersand en el parametro? Seguramente lo habra hecho asi, lo cual no funcionara. Por esto pedi que lo verificara. Al hacerlo, el programa probablemente se habra bloqueado. Esto es erroneo porque la funcion "scanf" requiere la direccion del entero. De hecho, aqui tenemos la direccion de un enteroÉ mediante el apuntador "the_int". Este es la direccion de un entero. Podriamos escribir esta linea ligeramente diferenteÉ de esta manera. En una funcion "scanf" comunmente tenemos un entero, del cual podemos hallar su direccion. Podemos tomar la direccion del contenido del apuntadorÉ y esto es exactamente lo que ocurre. Este proceso es muy explicito, pero obviamente es redundante. Es como tener un doble signo de negacion. Estos dos operadores no son convenientesÉ y podemos eliminarlos, pues se cancelan el uno al otro. Ya vimos que este codigo funciona. Este es un buen codigo reutilizable llamado "my_scanf", el cual resultaÉ mas sencillo que tener que llamar a la funcion "scanf". Es un poco mas sencillo aunque no demasiado. Ahora podemos utilizar la funcion "my_scanf"É si en adelante queremos leer un valor entero. Por supuesto esta solo funciona con valores enteros. Esto es todo. Ahora veamos el proyecto del curso. Aqui tenemosÉ los cinco archivos del proyecto. Primero abrimos el archivo "database.h"É para ver las modificaciones realizadas. En este archivo unicamente he modificado algunos prototiposÉ llamados "read_cd" y "print_cd". El prototipo "print_cd" tomaba el valor "cd_t", que es una abreviacion de esta linea, y lo utilizaba de esta manera. Lo he cambiado de esta manera, asi que ahora toma un apuntador de uno de estos valores, lo cual hace al programa mas eficiente. Igualmente, la funcion "read_cd" no restituye el valor "cd_t"É como antes, sino que ahora restituye un entero regular. aunque en realidad no restituye ningun valor. Ahora toma a "cd" como parametro, el cual va a modificar. Esta leera los detalles dentro del parametro pasado a ellaÉ porque ese parametro es un apuntador o la direccion del CD en cuestion. Ese es el unico cambio que he realizado. Veamos el archivo "main.c". Aqui lo tenemos. Aqui tenemos pocas modificaciones. La unica diferencia incluida corresponde a la lectura de los CDs. Esta linea ahora es ligeramente diferente. Ahora estamos pasando la direccionÉ de uno de los elementos del arreglo "cds". ÀUsted lo hizo asi? Si lo hizo, tambien habra cambiado esta linea que es exactamente igual. Al ser esta linea exactamente igual, el codigo es un poco mas consistente. Esos son los cambios del archivo "main.c". Ahora veamos el archivo "output.c" que ha cambiado un poco, pues ahora la funcion "print_cd" toma un apuntador a "cd" y no la variable "cd" en si. Antes tomaba esto y ahora toma esto. Ya que hemos hecho esto, debemos revisar la funcion "print_cd"É y cambiar todas las referencias a estos campos o "cd.title" por "cd->title". En total son 5 cambios requeridos en la funcion "print_cd". Cerramos esto y abrimos el archivo "input.c", el cual ha cambiado casi de la misma manera. Las funciones "enter" y "yesno" no han cambiado porque no se refieren a estructuras, al igual que "read_int", "read_float" y "read_string". En cambio, la funcion "read_cd" si ha cambiado. Antes no tomaba parametros, pero ahora toma uno. Tambien restituia el valor de "cd", y ahora no lo hace. Asi mismo, tenia su propia variable local "cd" de tipo "cd_t" de esta manera, pero la eliminamos porque esta esta siendo pasada aqui. No necesitamos un duplicado si podemos trabajar con el original. Tambien cambiamos todos los codigos "cd.title" por "cd->title". No necesitamos una sentencia de restitucion porque no restituimos ningun valorÉ y esto es todo. El archivo "utils.c" no ha cambiado en absoluto porque solo contiene una funcion para eliminar la nueva linea de una cadena, la cual obviamente no tiene que ver con estructuras. Veamos si funciona. Compilamos sin errores en todo el proyecto, lo cual es bueno, y el programa se ejecuta bien. No es necesario verificarlo. Excelente. Esto es todo en cuanto a los apuntadores basicos.

Tutorial Information

Course: C Programming (Español)
Author: Mark Virtue
SKU: 33759
ISBN: 1-933736-81-X
Release Date: 2007-04-16
Duration: 21.5 hrs / 139 lessons
Captions: Available on CD and Online University
Compatibility: Vista/XP/2000, OS X, Linux
QuickTime 7, Flash 8

VTC Sign up & Benefits

  • Unlimited Access
  • 98,729 Video Tutorials (23,265 free)
  • Video Available as Flash or QuickTime
  • Over 1026 Courses
  • $30 for One Month Access
  • Multi-User Discounts Available