Compartilhar via


Operadores de indireção e endereço de

O operador de indireção (*) acessa um valor indiretamente, por meio de um ponteiro. O operando deve ser um valor de ponteiro. O resultado da operação é o valor resolvido pelo operando; isto é, o valor no endereço para o qual o operando aponta. O tipo do resultado é o tipo endereçado pelo operando.

Se o operando apontar para uma função, o resultado será um designador de função. Se ele apontar para um local de armazenamento, o resultado será um valor l que designa o local de armazenamento.

Se o valor do ponteiro for inválido, o resultado será indefinido. A lista a seguir inclui algumas das condições mais comuns que invalidam um valor de ponteiro.

  • O ponteiro é um ponteiro nulo.

  • O ponteiro especifica o endereço de um item local que não está visível no momento da referência.

  • O ponteiro especifica um endereço que está alinhado de forma inadequada para o tipo do objeto apontado.

  • O ponteiro especifica um endereço não usado pelo programa em execução.

O operador address-of (&) fornece o endereço de seu operando. O operando do operador address-of pode ser um designador de função ou um valor l que designa um objeto que não é um campo de bits e não é declarado com o especificador de classe de armazenamento register.

O resultado da operação de endereço é um ponteiro para o operando. O tipo endereçado pelo ponteiro é o tipo do operando.

O operador address-of pode ser aplicado somente a variáveis com tipos fundamentais, de estrutura ou união que são declarados no nível de escopo do arquivo, ou a referências de matriz subscrita. Nessas expressões, uma expressão constante que não inclui o operador address-of pode ser adicionada ou subtraída da expressão de endereço.

Exemplos

Os exemplos a seguir usam estas declarações:

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

Esta instrução usa o operador address-of:

pa = &a[5];

O operador address-of (&) usa o endereço do sexto elemento da matriz a. O resultado é armazenado na variável de ponteiro pa.

x = *pa;

O operador de indireção (*) é usado neste exemplo para acessar o valor int no endereço armazenado em pa. O valor é atribuído à variável de inteiro x.

if( x == *&x )
    printf( "True\n" );

Este exemplo imprime a palavra True, demonstrando que o resultado da aplicação do operador de indireção ao endereço de x é o mesmo que x.

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

int  *proundup  = roundup;
int  *pround  = &roundup;

Uma vez que a função roundup é declarada, dois ponteiros para roundup são declarados e inicializados. O primeiro ponteiro, proundup, é inicializado usando apenas o nome da função, enquanto o segundo, pround, usa o operador address-of na inicialização. As inicializações são equivalentes.

Consulte também

Referência

Operador de indireção: *

Operador Address-of: &