You are on page 1of 4

Punteros en Lenguaje C:

Puntero:
Empezamos con la definicin de punteros:
Def: Una variable tipo puntero (o puntero) es una variable que en su interior almacena
una direccin de memoria.
As entonces, debemos saber que las direcciones de memoria de una computadora se
expresan como nmeros hexadecimales y estos a su vez se escriben acompaados de una
letra H, indicando que ese nmero es hexadecimal. Ejemplos: 24AF H, A120 H, DA65 H.
Una variable simple de tipo int, almacena solo nmeros enteros. Una variable simple de
tipo float almacena nmeros con punto decimal (reales). Una variable de tipo char
almacena un carcter ASCII. Por lo tanto, siguiendo la definicin dada y la lgica anterior,
dentro de un puntero habr siempre almacenado un nmero con formato hexadecimal que
corresponde a una direccin de memoria.

Declaracin e Inicializacin:
Para declarar un puntero partamos del ejemplo siguiente:
int *puntero1;

Con esta lnea escrita en nuestro programa acabamos de crear un puntero que est
preparado para almacenar direcciones de variables enteras, ya que le pusimos el prefijo
int. Del mismo modo, si quisiramos trabajar con punteros de variables float deberamos
escribir:
float *puntero2;

Pero inicialmente si solo escribimos esas lneas:


Qu tiene en este momento almacenado puntero1 o puntero2?
Inicialmente, como cualquier otra variable, si no la inicializamos, puntero1 o puntero2
tendrn almacenados valores aleatorios (basura) en hexadecimal. Para hacer que los
punteros sean tiles, debemos hacer que apunten a alguna variable. Para lograr esto,
suponemos que hemos declarado previamente una variable simple entera (tipo int) llamada
x y queremos hacer que puntero1 apunte a x. Se escribe entonces la siguiente instruccin:
puntero1=&x;

PNF

Desglosemos esta ultima instruccin: En lenguaje C, para obtener la direccin de una


variable, hacemos uso del operador & (ampersand). Es decir que LA DIRECCION de x
es &x, as como LA DIRECCION de una variable k ser &k y si tengo una variable
llamada pepe, accedo a SU DIRECCION con &pepe.
De este modo, lo que hemos hecho en la ltima instruccin, es asignarle un valor a
puntero1: ese valor es la direccin de x (recordar que un puntero ALMACENA UNA
DIRECCION DE MEMORIA).
La forma en que se le dio valor a puntero1 es idntica a como se le dan valores a las
variables simples. Por ejemplo la instruccin
k=56;

le da a la variable k el valor 56 (siendo k una variable entera). Lo nico que difiere es que
ahora a puntero1 en lugar de almacenarle un numero entero, le hemos asignado una
direccin.

Indireccion:
Ahora vamos a ver el concepto de indireccion:
Indireccion es acceder INDIRECTAMENTE al valor de una variable, es decir, utilizar una
variable pero sin usarla en forma directa. Hasta ahora nosotros por ejemplo a nuestra
variable entera x podamos darle valor accediendo directamente a ella de la siguiente
forma:
x=32;

lo cual se lee a la variable x asgnele el valor 32. Pero ahora tambin tenemos la opcin
de hacer la misma operacin de asignacin accediendo indirectamente a x. Para ello usamos
el hecho de que anteriormente ya hemos dado la orden (puntero1=&x) de que un puntero
(puntero1) apunte a la variable x. Por lo tanto haciendo uso de ese puntero, podemos
escribir:
*puntero1=32;

lo cual se lee A la variable a la que apunta puntero1, asgnele el valor 32. Ntese que en
esta ultima instruccin, no aparece la variable x. Esto es as ya que hicimos acceso a ella en
forma indirecta usando el operador de indireccion (*).

PNF

Ejemplo:
Para diferenciar los conceptos usemos el siguiente ejemplo, aclarando que es cada cosa.
int x, *puntero1; //declaramos x y el puntero
puntero1=&x; //se hace que puntero1 apunte a la variable x
//almacenando en puntero1 la direccin de x
x=32;//se le da el valor a x directamente (tambin vale
//*puntero1=32)
printf(El valor de x es: %d\n,x); //Se muestra el valor de x
//haciendo acceso directo a la variable x
printf(El valor de x es: %d\n,*puntero1); //Se muestra el valor
//de x indirectamente
printf(La direccin de la variable x es: %p\n,&x);//Se muestra
//la direccin de x directamente
printf(La direccin de la variable x es: %p\n,puntero1); //O se
//muestra la direccin de x mostrando el valor que tiene
//almacenado puntero1

Uso de punteros como parmetros de funciones:


Hasta ahora hemos hecho un uso poco extensivo de los punteros. Pero, se puede explotar
mas el concepto en el uso de funciones o subprogramas. Supongamos que queremos hacer
una funcin a la que se le enviaran dos nmeros y nos devolvera la suma, la resta y el
producto de ambos. Naturalmente con paso de parmetros por valor nicamente no
podemos hacer una sola funcin que devuelva las tres cosas, ya que de esa forma las
funciones devuelven como mximo UN SOLO VALOR, y por lo tanto deberamos hacer
TRES funciones por separado que hagan cada una las tres cosas por separado (solo se
muestra la cabecera de las funciones mencionadas):
int sumar(int a,int b);
int restar(int a,int b);
int multiplicar(int a,int b);

sin embargo, si hacemos una funcin a la que se le pasen parmetros por referencia (es
decir, que reciba como argumentos punteros) y usamos adems la indireccion, podemos
lograr hacer todo en una nica funcin:
void sum_res_mul(int a,int b,int *s,int *r,int *p);

Por qu esto es posible? Debido a que la funcin sum_res_mul recibir LA DIRECCION


de 3 variables y luego modificara el valor de esas variables indirectamente (usando *). Al
regresar al mbito donde esa funcin fue invocada, las variables a las que apuntaban los
PNF

punteros de la cabecera de la funcin (*s,*r y *p), tendrn el valor de la suma, la resta y el


producto de a y b respectivamente y entonces hemos logrado as que una funcin devuelva
3 valores, lo cual resulta de mucha utilidad. Finalizamos la explicacin haciendo un
desarrollo de este ltimo ejemplo en un programa ms completo.
#includestdio.h
void sum_res_mul(int a,int b,int *s,int *r,int *p); //declaramos
//la funcin sum_res_mul
int main(int argc,char *argv[]){
int a=22, b=12; //declaramos dos variables int con valores
int suma,resta,producto;//declaramos tres variables simples
//(NO PUNTEROS) que se pasaran como parmetros a la funcin
//sum_res_mul
sum_res_mul(a,b,&suma,&resta,&producto);//invocamos la
//funcin que es de tipo void. VER ACLARACION!
printf(Suma = %d\n,suma);//mostramos el valor de la suma
printf(Resta= %d\n,resta); //mostramos el valor de la resta
printf(Producto= %d\n,producto); //mostramos el valor del
//producto
return 0;
}
void sum_res_mul(int a,int b,int *s,int *r,int *p){
*s=a+b;//indirectamente a la variable suma le asignamos a+b
*r=a-b; //indirectamente a la variable resta le asignamos
//a-b
*p=a*b;//indirectamente a la variable producto le asignamos
//a*b
return;//como es una funcin void esta lnea es opcional
}

Aclaracin: El mbito de un programa se conoce como la funcin actual que est ejecutando el
mismo en un momento dado. Cuando realizamos la invocacin a la funcin sum_res_mul,
estaremos en el mbito main, y luego pasaremos al mbito sum_res_mul y una vez que se
realizan todas las instrucciones de este mbito, volveremos al mbito main.

Ntese que en el ejemplo la funcin es de tipo void, es decir que ni siquiera fue necesario
que devuelva un valor de la forma clsica usando un return (se conoce como forma esttica)
ya que los tres valores de la funcin son devueltos por referencia (se conoce como forma
dinmica).

Pablo Nicols Forcada Ayudante estudiantil de la Ctedra de Informtica y Programacin I


PNF

You might also like