Indireção e operadores de endereço
O operador de indireção (*) acessa um valor indiretamente, através de um ponteiro.O operando deve ser um valor de ponteiro.O resultado da operação é o valor endereçado pelo operando; ou seja, o valor no endereço para o qual seu operando aponta.O tipo do resultado é o tipo de operando de endereços.
Se o operando aponta para uma função, o resultado é um designador de função.Se ele apontar para um local de armazenamento, o resultado é um l-value designando o local de armazenamento.
Se o valor do ponteiro for inválido, o resultado é indefinido.A lista a seguir inclui algumas das condições mais comuns que invalidar um valor de ponteiro.
O ponteiro é um ponteiro nulo.
O ponteiro Especifica o endereço de um item de local que não está visível no momento da referência.
O ponteiro Especifica um endereço inadequadamente alinhado para o tipo do objeto apontado.
O ponteiro Especifica um endereço que não são usado pelo programa em execução.
O operador adress-of (e) fornece o endereço do seu operando.O operando do operador adress-of pode ser um designador de função ou um valor de l que designa um objeto que não é um campo de bits e não é declarado com o registrar o especificador de classe de armazenamento.
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 adress-of só pode ser aplicado às variáveis com a estrutura fundamental, ou união tipos declarados no nível do escopo do arquivo ou para subscripted referências de matriz.Nessas expressões, uma expressão de constante não inclui o operador adress-of pode ser adicionada ao ou subtraída da expressão de endereço.
Exemplos
Os exemplos seguintes usam essas declarações:
int *pa, x;
int a[20];
double d;
Esta instrução usa o operador adress-of:
pa = &a[5];
O operador adress-of (e) leva o endereço do sexto elemento da matriz a.O resultado será armazenado na variável de ponteiro pa.
x = *pa;
O operador de indireção (*) é usado neste exemplo, para acessar o int o valor no endereço armazenado em pa.O valor é atribuído à variável integer x.
if( x == *&x )
printf( "True\n" );
Este exemplo imprime a palavra True, que demonstram que o resultado da aplicação do operador de indireção ao endereço do x é o mesmo que x.
int roundup( void ); /* Function declaration */
int *proundup = roundup;
int *pround = &roundup;
Uma vez, a função roundup for declarado, dois ponteiros para roundup são declaradas e inicializadas.O primeiro ponteiro, proundup, é inicializada usando somente o nome da função, enquanto o segundo, pround, usa o operador adress-of na inicialização.As inicializações são equivalentes.