sábado, 22 de febrero de 2014

Punteros



Un puntero es una variable que "apunta"(refiere) a una posición en la memoria o a una variable que contiene una dirección de memoria. Veamos esto a través de un ejemplo:

#include<stdio.h>
#include<math.h>

int main()
{
    float var=M_PI;
    float *pf;
    printf("Las direcciones de las variables: var:%x y pf:%x\n",&var,&pf);
    printf("Sus valores: var = %f y pf = %x\n",var,pf);

    pf = &var;
    printf("Las direcciones de las variables de nuevo: var %x y pf:%x\n",&var,&pf);
    printf("Sus valores: var = %f y pf = %x\n\n",var,pf);
    printf("Obtenemos el dato guardado en la dirección a la que apunta pf: %f\n",*pf);

    return 0;
}

Para obtener el valor de pi(M_PI) hemos usado la librería matemática que no se enlaza por defecto cuando vamos a compilar. Esto es, para compilar debemos hacer:
gcc punteros.c -o punteros -lm

Aqui podemos diferenciar la dirección en memoria en la que se encuentra el puntero y a la cual apunta, así como la forma en que se obtiene el valor guardado en el puntero y el valor guardado en la ubicación en la memoria a la que apunta el puntero.

También podemos pasar punteros como argumentos a funciones:
#include <stdio.h>

double promediar(int *arr, int tamano);

int main ()
{
   int datos[5] = {1000, -2, 0.3, 0.17, -0.5};
   float promedio;
 
   promedio = promediar( datos, 5 ) ;

   printf("El promedio de los datos es: %f\n", promedio );

   return 0;
}

float promediar(int *arr, int tamano)
{
  int i, sum = 0;       
  float prom; 
  for (i = 0; i < tamano; i++)
  {
    sum += arr[i];
  }
 
  prom = (double)sum / size;
 
  return prom;
}


Veamos que pasa con los argumentos de funciones cuando los pasamos como punteros o como valores.
#include<stdio.h>

void valor(int a)
{
    a=10;
    printf("En la función valor a = %d\n",a);
}

void referencia(int *a)
{
    *a=10;
    printf("En la función referencia a = %d\n",a);
}

int main()
{
    int numero=0;

    valor(numero);
    printf("Luego de la función valor numero = %d\n",numero);
    referencia(&numero);
    printf("Luego de la función referencia numero = %d\n",numero);    
}


Ejercicios
  • Realice una función que intercambie 2 valores por referencia.

No hay comentarios:

Publicar un comentario