Ir al contenido

Operador de desreferencia

De Wikipedia, la enciclopedia libre

El operador de 'desreferencia' u operador de indirección, identificado por el asterisco "*", es un operador unario usado en lenguajes de programación que incluyen variables de tipo puntero, como el lenguaje C y varios de sus descendientes. Opera sobre una variable de tipo puntero y devuelve una expresión equivalente al valor contenido en la dirección apuntada por dicho puntero. Esta operación recibe el nombre de "desreferenciar". Por ejemplo:

int x = 0;
int *puntero_a_x = &x;    // * se usa para declarar un puntero
*puntero_a_x = 1;    // * es el operador de indireccion
// x ahora contiene 1

El código anterior asigna el valor 1 a la variable x usando el operador de desreferencia sobre un puntero a dicha variable.

Composición

[editar]

El operador unario *, tal y cómo está definido en C y C++, puede ser usado en composiciones en caso de indirección múltiple, donde se necesita desreferenciar varias veces. De forma parecida, el operador punto . de Java puede ser usado en composiciones complejas que requieran desreferenciar punteros durante su evaluación.

Un ejemplo básico de un puntero con múltiples indirecciones es el argumento argv de la función main en C y C++, que se puede declarar como char **argv. Tanto el nombre del ejecutable lanzado como los argumentos que se le pasan desde la Línea de comandos se almacenan en diferentes cadenas de caracteres. El sistema operativo crea un vector de punteros de tipo char y cada uno de estos punteros apunta al primer carácter de las cadenas de caracteres mencionadas. Este vector de punteros es pasado a la función main en el argumento argv. El vector pasado "decae" a puntero, dado que argv es de hecho, un puntero a un puntero a char, aunque esté apuntando a un vector de punteros a char (a su vez, los punteros del vector, aunque apunten a un solo char están en realidad apuntando a una cadena de caracteres). El parámetro argc que se pasa adicionalmente a main, indica el tamaño del vector (la cantidad de cadenas de caracteres a las que argv está apuntando). Así pues, argv es un puntero al primer elemento (situado en la posición 0) de un vector de punteros a char, y al desreferenciarlo (*argv) obtenemos dicho elemento. En caso de hacer una doble desreferenciación (**argc) obtendremos el primer carácter de la cadena almacenada en el primer elemento del vector, que por convención sería la primera letra del nombre del programa.

Otras sintaxis

[editar]

En BCPL, un predecesor de C, el operador equivalente se representaba mediante el signo de exclamación.

En C y C++, para acceder a los campos de un objeto apuntado por un puntero, se puede desreferenciar dicho puntero y usar el operador punto . o bien usar el operador flecha ->:

struct objeto
{
   int o;
};

objeto o;
objeto *po = &o;

(*po).o = 1; // Desreferenciar y acceder al campo ‘o’.
po->o = 2;   // Acceso al campo ‘o’ con el operador flecha.

El operador unario de indirección o el operador flecha tan sólo pueden usarse sobre punteros; estos operadores pueden encadenarse, por ejemplo en una lista enlazada puede accederse al nodo posterior al siguiente nodo->siguiente->siguiente (siempre y cuando nodo->siguiente apunte a una dirección válida).

En los archivos de proceso por lotes de Unix y utilidades como Make el símbolo del dólar "$" es el operador de desreferencia, usado para traducir el nombre de una variable a lo que esta contiene.

En varios lenguajes, se usan prefijos en los identificadores, estos prefijos se conocen como Sigil. Estos no son operadores unarios (ya que forman parte del nombre del identificador) y tienen diferentes semánticas, como indicar el tipo de dato del identificador. Sin embargo sintácticamente son similares al operador de indirección y pueden ser confundidos con este. Por ejemplo, en un archivo de proceso por lotes $FOO usa el operador de indirección $ sobre la variable FOO, mientras que en Perl $foo is una variable de tipo escalar llamada foo.

Véase también

[editar]