Os ponteiros em linguagem C

Maio 2017


Definição de um ponteiro


Um ponteiro é uma variável com o endereço de outra variável de um determinado tipo. A noção de um ponteiro, muitas vezes, dá medo, porque é uma técnica de programação muito poderosa, que permite definir estruturas dinâmicas, isto é, que evoluem ao longo do tempo (ao contrário de tabelas que são, por exemplo, estruturas de dados estáticos cujo tamanho é fixo na definição).

Entender a noção do endereço


Como vimos, um ponteiro é uma variável que armazena um endereço, então, é preciso compreender o que é um endereço.

Quando executamos um programa, ele fica armazenado na memória; isto significa que, por um lado, o código a ser executado é armazenado, mas também, que cada variável definida tem uma área de memória que lhe foi reservada, e o tamanho desta área corresponde ao tipo de variável que declaramos.

Na verdade, a memória é composta de varias de casinhas de 8 bits (um byte). Uma variável, dependendo do seu tipo (isto é,seu tamanho), vai ocupar uma, ou mais, dessas casas (uma variável do tipo "char" vai ocupar uma única casa, enquanto que uma variável do tipo "long" vai ocupar 4 caixas consecutivas).

Cada uma dessas "casas" (chamadaos de blocos) é identificada por um número. Este número é chamado endereço.

Assim, você pode acessar uma variável de 2 maneiras:

  • Graças ao seu nome
  • Graças ao endereço do primeiro bloco alocado à variável


Então, basta armazenar o endereço da variável em um ponteiro (ele foi planejado para isso) para acessá-la (diz-se que "apontamos para a variável").



A imagem acima mostra, por exemplo, por que mecanismo é possível apontar uma variável (do tipo ponteiro) para outro. Aqui, o ponteiro armazenado no endereço 24 aponta para uma variável armazenada no endereço 253 (obviamente,os valores são arbitrários).

Como conhecer o endereço de uma variável?


Na verdade, você nunca precisará escrever o endereço de uma variável, especialmente por que ela muda a cada lançamento do programa, já que o sistema operacional aloca blocos de memória que são gratuitos, e estes não são os mesmos em cada execução.

Então, existe uma sintaxe permitindo que se conheça o endereço de uma variável, sabendo o seu nome:
Basta preceder o nome da variável do caractere & ("E comercial") para designar o endereço desta variável:

 &Nome_da_variável

Interesse dos ponteiros


Os ponteiros apresentam vários interesses:

  • Eles permitem manipular, de uma maneira bem simples, os dados que podem ser importantes (em vez de ir para uma função/um elemento muito grande (em tamanho) podremos, por exemplo, fornecer um ponteiro para este elemento...).
  • As tabelas só armazenam um número fixo de elementos do mesmo tipo. Ao armazenar ponteiros nas casas de uma tabela, é possível armazenar elementos de diferentes tamanhos, e até mesmo adicionar elementos à tabela em uso (esta é a noção de tabela dinâmica que está intimamente relacionada ao ponteiro).
  • É possível criar estruturas encadeadas, isto é, com links.

Declaração de um ponteiro


Um ponteiro é uma variável que deve ser definida, especificando o tipo de variável apontada, da seguinte maneira:

tipo * Nome_do_ponteiro


O tipo de variável apontada pode ser, tanto um tipo primário (como o int, char...), quanto um tipo complexo (como o struct...).


Um ponteiro deve, preferencialmente, ser tipado!
No entanto, é possível definir um ponteiro em 'void', isto é, em algo que não tenha nenhum tipo pré-definido (void * toto). Geralmente, este tipo de ponteiro é usado como ponteiro de transição, em uma função genérica, antes d uma conversão de tipo que permitirá o acesso real aos dados apontados.


Graças ao símbolo '*', o compilador sabe que se trata de uma variável do tipo ponteiro, e não de uma variável ordinária; além disso, jà que você especificou (obrigatoriamente) o tipo de variável, o compilador saberá quantos blocos seguem o bloco localizado no endereço apontado.

Inicialização de um ponteiro


Depois de declarar um ponteiro é preciso inicializá-lo. Isto é muito importante porque ao declarar um ponteiro, ele contém o que a casa, onde ele está armazenado, continha antes, ou seja, qualquer número. Em outras palavras, se você não inicializar o seu ponteiro, ele pode apontar para uma área de risco de sua memória, que pode ser um pedaço de seu programa ou ...do seu sistema operacional!


Um ponteiro não inicializado é perigoso!

Para inicializar um ponteiro, use o operador de atribuição '=' seguido do operador de endereço '&', que está ligado a um nome de variável (esta deve, naturalmente, ter sido definida antes. ..):

 Nome_do_ponteiro = &nome_da_variável_apontada;



Por exemplo:

int a = 2;

char b;
int *p1;
char *p2;
p1 = &a;
p2 = &b;

Acessar uma variável apontada


Depois (e somente depois) de ter declarado e inicializado um ponteiro, é possível acessar o conteúdo do endereço da memória apontada pelo ponteiro, graças ao operador'*'. A sintaxe é a seguinte:

Por exemplo:

int a = 2;

  • p1 = 10;
  • p2 = 'a';


Após estas duas instruções, o conteúdo das variáveis a e b será, respectivamente, 10 e 97 (61 em hexadecimal, o código ASCII associado ao caractere 'a').

Se você quiser usar esta notação em uma expressão mais complexa, você deverá usar parênteses:

Por exemplo:

a = (*p)++;

Saiba mais





Tradução feita por Lucia Maurity y Nouira

Veja também

Publicado por pintuda. Última modificação: 22 de outubro de 2011 às 13:55 por pintuda.
Este documento, intitulado 'Os ponteiros em linguagem C', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.