next up previous contents
Next: Tipos agregados Up: Tipos de dados Previous: Escalares   Sumário

Ponteiros

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.


next up previous contents
Next: Tipos agregados Up: Tipos de dados Previous: Escalares   Sumário
Ivan L. M. Ricarte 2003-02-14