Monday, July 11, 2011
Contenido extra: Punteros
Un puntero es una variable un tanto especial. Con un puntero podemos almacenar direcciones de memoria. En un puntero podemos tener guardada la dirección de una variable.
Un puntero se define igual que una variable normal, salvo que delante del identificador se colocara un asterisco. Por ejemplo:
char *pc; /*puntero a carácter */
char *pi; /* puntero a entero */
Normalmente al definir un puntero lo suelen inicializar para que apunte a algún dato.
Se dispone de tres formas de inicializar un puntero:
Inicializarlo con la dirección de una variable que ya existe en memoria.
Para obtener la dirección en la que está ubicada una variable colocamos delante del identificador de la variable el operador dirección &. No se suele dejar espacios entre el signo & y el identificador. Por ejemplo:
char *p = &p1;
Asignarle el contenido de otro puntero que ya está‚ inicializado:
char *p = &p1;
char *p2 = p; /* p ya est inicializado */
Inicializarlo con cualquier expresión constante que devuelva un lvalue.
Las más frecuentes son una cadena de caracteres, el identificador de un arreglo, el identificador de una función, y otros muchos. Este es un detalle importante: los identificadores de funciones y de arreglos son en si mismos valores por la izquierda (lvalues), por lo que se pueden usar directamente para inicializar punteros.
Una forma adicional de inicializarlo es darle directamente una posición de memoria. Este método no es portable, ya que depende del sistema, pero suele ser muy útil en programación de sistemas, que es uno de los usos fundamentales del C.
Un error muy frecuente consiste en no inicializar el puntero antes de usarlo. Este error frecuentemente lo localiza el compilador y avisa de ello.
Declaración de un puntero
Un puntero, en C, se declara como sigue:
TIPO * nombre_puntero ;
Donde TIPO es cualquier tipo definido. Asi, un puntero a caracter se declararia de la siguiente forma:
char *pchar;
Diferencia entre "*" y "&"
En C, al contrario que en otros lenguajes de programacion, se puede obtener directamente la direccion de memoria de cualquier variable. Esto es posible hacerlo con el operador unario "&"; asi:
char a; /* Variable 'a' de tipo char */
printf("la direccion de memoria de 'a' es: %p \n", &a);
y para obtener lo apuntado por un puntero se utiliza el operador unario "*" de esta forma:
char a; /* Variable 'a' de tipo char */
char *pchar; /* Puntero a char 'pchar' */
pchar = &a; /* 'pchar' <- @ de 'a' */
printf("la direccion de memoria de 'a' es: %p \n", &a);
printf("y su contenido es : %c \n", *pchar);
Uno de los casos mas comunes donde se ve la relacion entre estos dos operadores es la declaracion y utilizacion de funciones:
void Funcion ( int *int_pointer )
/* Paso de una variable de tipo entero por REFERENCIA */
/* equivalente en Modula 2: PROCEDURE Funcion ( VAR a:INTEGER ) */
.
.
.
int a;
a=6;
Funcion ( &a ); /* ya que la declaracion de la funcion pide la
direccion de una variable de tipo entero */
Los punteros tienen muchas utilidades, por ejemplo nos permiten pasar argumentos (o parámetros) a una función y modificarlos. También permiten el manejo de cadenas y de arrays. Otro uso importante es que nos permiten acceder directamente a la pantalla, al teclado y a todos los componentes del ordenador.
BIBLIOGRAFIA
http://www.elrincondelc.com/cursoc/cursoc9.html
http://linuxupc.upc.es/~pep/OLD/Punteros.html
http://translate.google.com.mx/translate?hl=es&langpair=en|es&u=http://www.cs.cf.ac.uk/Dave/C/CE.html
http://www.wikiciencia.org/informatica/programacion/c/index.php
Subscribe to:
Post Comments (Atom)
Gracias por esta aportación. Los punteros o apuntadores son una de las herramientas más poderosas del lenguaje C pero no son exclusivos de C. En C los manejamos por decir de alguna manera "a mano" pero en Java, por ejemplo, aunque no es evidente el uso de apuntadores, en realidad sí se están utilizando aunque no se controlan de forma tan flexible como en C. En Java cuando creamos un arreglo utilizamos la palabra reservada "new" que es la encargada de reservar espacio en memoria, es decir, se podría decir que es el equivalente a "malloc" de C. Veamos esto:
ReplyDeleteDeclaración de un arreglo de enteros en C:
int* arreglo = (int*)malloc(sizeof(int)*elementos);
Declaración de un arreglo en Java:
int [] arreglo = new int[elementos];
"new" devuelve la dirección del primer byte del bloque de memoria reservado para el arreglo de enteros, como los apuntadores son variables que contienen direcciones de memoria, podemos decir que a través de "new" tenemos un apuntador a la dirección de memoria del primer byte de nuestro arreglo.
Bien; +4 Norma y +2 Mariana.
ReplyDelete