[C con Clase] Punteros

Steven Davidson srd4121 en njit.edu
Jue Mayo 28 23:28:40 CEST 2009


Hola Diego,

David ya te ha respondido, pero quiero agregar a lo que ha dicho y 
también aclarar algunas cosas que mencionas.

Diego wrote:
> Nuevamente hola a toda la lista que en realidad me han ayudado mucho
> durante este corto tiempo, gracias.
> 
> Bueno resulta que en la universidad estamos pasando punteros en c y
> la verdad es que la base la entiendo, por ejemplo:
>    
> int a=4;  //variable a entero
> int *punt; //creo el puntero *punt com entero
> 
> punt=&a; //asigno a punt la direccion de memoria donde se aloja a (apunto a a)
> 
> printf("%i", punt); //mostrara la direccion de memoria donde se aloja a

Si quieres mostrar la dirección de memoria, deberías usar %p. Esto es,

printf( "%p", punt );

> printf("%i", punt); //mostrara el valor de la variable a
> 

No. Lo que seguramente querías escribir es lo siguiente:

printf( "%i", *punt );

Recuerda que los punteros son una forma de indirección, y por tanto hay 
que hacer tantos accesos a la memoria como niveles de indirección existan.

> tambien entiendo que en scanf("%i", &a); el & actua como un puntero
> asignando el valor ingresado por el usuario a la direccion de memoria
> en donde se ubica la variable a
> 

Sugiero hacer una distinción entre puntero, que es un tipo y a veces una 
variable de tal tipo, y una dirección de memoria. Ciertamente, el 
operador & sirve para conseguir la dirección de memoria de una variable.

> 
> eso lo entinedo , ahora lo que se me hace dificil de entender es que
> este mismo codigo sin punteros seria mucho mas corto sin ellos, claro
> no se podria mostrar la direccion de memoria, pero solo eso, es por
> ello que no entiendo efectivamente para que me sirven los punteros no
> entiendo su uso.
> sea como argumento de funciones, o su trabajo en conjunto con los
> arreglos u estructuras
> 

Efectivamente, nadie escribiría un programa como el siguiente:

int a = 5;
int *ptr = a;

*ptr += 10;

printf( "%d", *ptr );

Obviamente, usaríamos la variable 'a'.


Un uso muy importante es a la hora de manipular memoria dinámicamente, 
especialmente para crear arrays dinámicamente. En C, usamos la función 
'malloc()'. Seguramente verás todo esto más adelante.

Otro uso importante es a la hora de pasar ciertos parámetros a 
funciones. C no ofrece el paso por referencia, solamente el paso por 
copia (o por valor). Para emular el comportamiento del paso por 
referencia, debemos usar punteros. Lo que sucede es que pasamos el 
puntero por copia, pero como es una forma de indirección, la variable 
apuntada sigue siendo la misma. De esta manera, podemos modificar esa 
variable apuntada. Por ejemplo,

void intercambiar( int *p1, int *p2 )
{
   int aux = *p1;
   *p1 = *p2;
   *p2 = aux;
}

Existen otros mecanismos que usan punteros. Por ejemplo, ciertas 
estructuras dinámicas de datos funcionan en base a punteros, donde cada 
elemento de la estructura apunta a otro elemento. Puedes consultar 
nuestro curso de EDD para que tengas una idea de lo que estoy hablando. 
El enlace es: http://c.conclase.net/edd/index.php

Otra variante interesante del puntero a una variable es el puntero a una 
función. Viene a ser básicamente lo mismo que un puntero regular, pero 
en este caso, la dirección de memoria guardada es la del comienzo de una 
función. Pero con un puntero, podemos manipular funciones y por tanto 
comportamiento. Asimismo, hacemos uso de los punteros regulares. 
Manipulamos variables y por tanto la información a través de un mismo 
mecanismo.


En fin, ya irás viendo todo esto poco a poco. Hasta luego,

Steven





Más información sobre la lista de distribución Cconclase