Antes de falar em ponteiros, é importante nos lembrarmos de alguns aspectos referentes à variáveis.Deve-se saber que variáveis possuem nomes que as identificam durante a execução do programa. Você deve saber também que uma variável armazena um valor (que pode ser fixo, no caso de uma constante, ou pode mudar durante a execução de seus códigos). Vetores em C são definidos como ponteiros para áreas consecutivas da memória. Deste modo é possível acessar cada elemento de diversas maneiras:

  1. include <stdio.h>

int main() {

   int arranjo[5] = { 2, 4, 3, 1, 5 };

   printf("%p\n", arranjo);      /* imprime o endereço do arranjo                                                              */
   printf("%d\n", arranjo[0]);   /* imprime o primeiro elemento do arranjo, 2                                                  */
   printf("%d\n", *arranjo);     /* imprime o primeiro inteiro do endereço apontado pelo arranjo, que é o primeiro elemento, 2 */
   printf("%d\n", arranjo[3]);   /* imprime o quarto elemento do arranjo, 1                                                    */
   printf("%p\n", arranjo+3);    /* imprime o terceiro endereço após o início do arranjo                                       */
   printf("%d\n", *(arranjo+3)); /* imprime o valor no tercero endereço após o início do arranjo, 1                            */

   return 0;

}

O processo descrito acima é chamado aritmética de ponteiros, e é usada em índices de ponteiros. Uma variável possui um endereço, o nome da variável não é nada mais que um apelido para a localização deste endereço. Desta forma, um ponteiro não é nada mais que um tipo especial de variável que armazena o endereço de outra. Veja um exemplo:

  1. include <stdio.h>
  2. include <stdlib.h>

int main(int argc, char *argv[]) {

 // variável do tipo int
 int valor = 10;
 // ponteiro para uma variável do tipo int
 int *p = &valor;
 // exibe o valor da variável "valor", apontada
 // pelo ponteiro p
 printf("%d", *p);
 printf("\n\n");
 system("PAUSE");
 return 0;

}

Neste código nós temos a declaração e definição de duas variáveis:

int valor = 10; int *p = &valor;

A primeira variável é uma variável do tipo int e a segunda é um ponteiro para uma variável do tipo int. Veja que devemos sempre usar "*" antes do nome de um ponteiro em sua declaração. O símbolo "&" serve para indicar que estamos acessando o endereço de uma variável e não o seu conteúdo. O resultado destas duas linhas é que agora temos um ponteiro que nos permite acessar e manipular a variável valor.