lunes, 22 de noviembre de 2010

Apuntadores

Los apuntadores  o punteros son unas de las características mas poderosas del lenguaje de programación ANSI C y a su vez podemos decir que una de las herramientas mas difíciles de dominar en el lenguaje.

Debemos mencionar que para tener un buen nivel en la programación o por lo menos pasar a un siguiente nivel es necesario tener un buen conocimiento sobre punteros, ya que con ellos podemos realizar infinidad de cosas como por ejemplo en los programas simular llamadas por referencias, crear y manipular estructuras de datos dinámicas (las que cambian su tamaño durante su ejecución), tales como listas enlazadas, colas, pilas y arboles.

Los apuntadores son variables que contienen direcciones de memoria como sus valores.Por lo regular una variable contiene directamente un valor especifico. Un apuntador, por otra parte, contiene la dirección de una variable que contienen un valor especifico. Un apuntador por otra parte, contiene la dirección de una variable que contiene un valor especifico. En este sentido, un nombre de variable se refiere directamente a un valor y un apuntador se refiere indirectamente a un valor.El referirse a un valor a través de un apuntador se le conoce como indirección.
Los apuntadores como cualquier otra variable, deben ser declarados antes de ser utilizados. La declaración

int *countPtr, count;

declara la variable countPtr siendo del tipo int, o bien “countPtr” apunta a un objeto del tipo entero”. También, la variable count se declara como un entero, no un apuntador a un entero. El símbolo * solo se aplica a countPtr en la declaración. Cuando el * se utiliza de esta forma en una declaración, indica que la variable que se esta declarando es apuntador. Los apuntadores pueden ser declarados para apuntar a cualquier tipo de datos.
La siguiente imagen muestra el ejemplo de una referenciacion directa o indirecta de una variable.
image 
Los apuntadores deben ser inicializados cuando son declarados o en un enunciado de asignación. Un apuntador puede ser inicializado a 0, Null o a una dirección. Un apuntador con el valor NULL no apunta a nada. Null es una constante simbólica, definida en el archivo cabecera de stdio.h Cabe mencionar que al inicializar un apuntador  con 0, es equivalente a inicializar un apuntador a NULL, pero es importante mencionar que para este caso es preferible utilizar Null. El valor 0 es el único valor entero que puede ser directamente asignado a una variable de apuntador.

Operadores de un puntero:
El & conocido como operador de dirección, es un operador unario que regresa la dirección de su operador. Por ejemplo, suponiendo las declaraciones
int y = 5;
int*yPtr
El enunciado yPtr = &y
asigna la dirección de la variable “y” a la variable de apuntador yPtr. La variable yPtr se dice entonces que “apunta a ”. La siguiente figura muestra una representación:donde podemos ver como un apuntador  “apunta ” a una variable entera.

image


Apuntadores a funciones:
Los apuntadores a funciones son quizá uno de los usos más confusos de los apuntadores en C. Los apuntadores a funciones no son tan comunes como otros usos que tienen los apuntadores. Sin embargo, un uso común es cuando se pasan apuntadores a funciones como parámetros en la llamada a una función.
El siguiente programa, muestra como calcular el cubo de cualquier numero mediante funciones, en la primera utiliza llamadas a funciones por valores, y la segunda utiliza llamadas a funciones por parámetros, estos últimos utilizan los apuntadores.
image

image

Los programas anteriores presentan dos formas de elevar un numero al cubo mediante funciones, en este caso las funciones cubeByValue y cubeByReference.
El primer programa pasa la variable number a la función cubeeByvalue, utilizando una llamada por valor. La función cubeByReference toma eleva al cubo su argumento y pasa su nuevo valor de regreso a main, utilizando el enunciado return. El nuevo valor se asigna a la variable number que se encuentra en main.

El segundo programa que hace exactamente lo mismo, pero en este caso este utiliza parameros por referencia, trabaja así: pasa la variable number utilizando una llamada por referencia(apuntador a la variable number) a la funcion cubeByReference. La funcion cubeByReference toma un apuntador a int conocido como nPtr como argumento. La funcion dereferencia el apuntador y eleva al cubo el valor hacia el cual apunta nPtr. Esto cambia el valor de number dentro de main.



Referencias:
http://www.fismat.umich.mx/mn1/manual/node11.html
Como programar en c/c++-Deitel-Deitel-Editorial PEARSON.

2 comentarios:

  1. Entonces la diferencia de un programa y del otro es la manera de de llamar a la funcion? , tengo entendido que cuando se hace una llamada por referencia se pueden alterar los valores originales de las variables con las cuales se ha llamado la función.

    ResponderEliminar
  2. por cierto , a veces es mejor hacer una llamada por referencia que llamada por valor ya que la de valor hace una copia del valor para poder trabajar con el valor en la función y la de referencia utiliza el valor directamente.

    ResponderEliminar