Operadores de direccionamiento indirecto y address-of

El operador unario de direccionamiento indirecto (*) accede a un valor indirectamente, mediante un puntero. El operando debe ser un tipo de puntero. El resultado de la operación es el valor al que hace referencia el operando; es decir, el valor de la dirección a la que señala el operando. El tipo del resultado es el tipo al que apunta el operando.

El resultado del operador de direccionamiento indirecto es type si el operando es del tipo pointer to type. Si el operando señala a una función, el resultado es un designador de función. Si señala a un objeto, el resultado es un valor L que designa el objeto.

Si el valor del puntero no es válido, el resultado del operador de direccionamiento indirecto es indefinido. Estas son algunas de las condiciones más comunes que invalidan un valor de puntero:

  • El puntero es un puntero null.

  • El puntero especifica la dirección de un objeto después del final de su vigencia en el momento de la referencia. (Por ejemplo, un objeto que está fuera del ámbito o que se ha desasignado).

  • El puntero especifica una dirección que está alineada de una forma no adecuada para el tipo de objeto al que se señala.

  • El puntero especifica una dirección no utilizada por el programa que se ejecuta.

El operador unario address-of ( & ) proporciona la dirección de su operando. El operando debe ser una de estas cosas:

  • Un lvalue que designa un objeto que no está declarado register y no es un campo de bits.

  • El resultado de un operador de desreferencia unario (*) o de desreferencia de matriz ([]).

  • Un designador de función.

El resultado es de tipo puntero aoperand_type para un operando de tipo operand_type.

Si el operando es el resultado de un operador unario *, no se evaluará ningún operador y el resultado será el mismo que si se hubiesen omitido ambos. El resultado no es un lvalue, y se siguen aplicando las restricciones de los operadores. Si el operando es el resultado de un operador [], el operador & y el unario * implícito en el operador [] no se evalúan. El resultado tiene el mismo efecto que si se eliminase el operador & y se cambiase el operador [] por un operador +. De lo contrario, el resultado es un puntero que señala al objeto o a la función designados por el operando.

Ejemplos

En los ejemplos siguientes se usan estas declaraciones comunes:

int *pa, x;
int a[20];

Esta instrucción utiliza el operador address-of ( & ) para tomar la dirección del sexto elemento de la matriz a. El resultado se almacena en la variable de puntero pa:

pa = &a[5];

En este ejemplo se utiliza el operador de direccionamiento indirecto (*) para acceder al valor int en la dirección almacenada en pa. El valor se asigna a la variable de entero x:

x = *pa;

En este ejemplo se muestra que el resultado de aplicar el operador de direccionamiento indirecto a la dirección de x es igual que x:

assert( x == *&x );

En este ejemplo se muestran otras maneras de declarar un puntero a una función:

int roundup( void );     /* Function declaration */

int  *proundup  = roundup;
int  *pround  = &roundup;
assert( pround == proundup );

Una vez declarada la función roundup, se declaran y se inicializan dos punteros a roundup. El primer puntero, proundup, se inicializa solo con el nombre de la función, mientras que el segundo, pround, utiliza el operador address-of en la inicialización. Las inicializaciones son equivalentes.

Vea también

Operador de direccionamiento indirecto:*
Operador Address-of: &