[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