Em C, é possível ter acesso não apenas ao valor de uma variável mas também ao seu endereço. O operador unário &, aplicado a uma variável, retorna o endereço de memória associado à variável. A manipulação de endereços dá-se através da utilização de ponteiros. Ponteiros constituem um dos recursos mais utilizados na programação C. Eles fornecem um mecanismo poderoso, flexível e eficiente de acesso a variáveis. Há computações que só podem ser expressas através do uso de ponteiros.
Para definir que uma variável vai guardar um endereço, o operador unário
*
é utilizado na declaração, como em
/* define um ponteiro para um inteiro */ int *ap; /* algumas variaveis inteiras */ int x, y;
Neste exemplo, ap é uma variável do tipo ponteiro para
inteiro, ou seja, ela irá receber um endereço de uma variável inteira.
Para se obter o endereço de uma variável, o operador unário &
pode
ser utilizado. No exemplo acima,
/* ap recebe o endereco de x */ ap = &x;
Após esta instrução, diz-se que ap aponta para x.
É possível acessar o valor da variável x através do ponteiro
usando o operador unário *
, como em
/* y recebe o conteudo da variavel apontada por ap */ y = *ap;
Observe que a combinação *ap
é um inteiro, que pode assim ser
atribuído a outro inteiro. Esta associação pode facilitar a compreensão da
declaração de ponteiros. No exemplo, int *ap
pode ser lido como
``*ap
é um inteiro.''
Também seria possível definir o valor de x através do ponteiro, como em
/* o conteudo da variavel apontada por ap recebe y */ *ap = y;
Ponteiros podem tomar parte em expressões aritméticas. Assim, a seguinte expressão é perfeitamente válida:
y = *ap + 1;ou seja, y receberia o valor de x (variável apontada por ap) incrementado de um.
Observe que a expressão ap + 1 expressa um incremento do ponteiro (endereço) e não do conteúdo. Neste caso, estaria indicando o inteiro que estivesse armazenado na posição de memória seguinte ao inteiro armazenado em ap. As únicas operações aritméticas envolvendo ponteiros que são permitidas são a soma ou subtração de um valor inteiro a um ponteiro e a diferença entre dois ponteiros. Para essas operações, a unidade corresponde ao tamanho em bytes do tipo manipulado pelo ponteiro. Assim, se o valor de ap é 1000 e em uma máquina X o inteiro é representado em dois bytes, ap+1 resulta em 1002. Porém, a mesma expressão em uma máquina Y com inteiros em quatro bytes retornaria 1004. Desse modo, o programador não precisa se preocupar com os detalhes do armazenamento, trabalhando simplesmente com ``o próximo inteiro.''
O ponteiro nulo é um valor que representa ``nenhuma posição de memória'', sendo útil para indicar condições de erro e evitar o acesso a áreas inválidas de memória. Em C, o ponteiro nulo é representado pelo valor 0.