Ponteiros C · 3 min read · Nov 20, 2025

Tutorial de Programação em C no Linux Parte 21: Ponteiros de caracteres, array de ponteiros e ponteiro para ponteiro

O conceito de ponteiros é, de fato, um dos conceitos muito importantes na linguagem de programação C. Até agora, discutimos vários aspectos dos ponteiros em C. Expandindo isso, neste tutorial, discutiremos mais alguns conceitos de ponteiros.

Ponteiros de caracteres, array de ponteiros e ponteiro para ponteiro em C

Vamos começar com ponteiros de caracteres com as seguintes linhas de código:

char p[] = "Eu gosto de HowtoForge"  
char *p = "Eu gosto de HowToForge"

A primeira linha define um array ‘p’ com tamanho igual ao número de caracteres entre aspas duplas. Mas a próxima linha define um ponteiro ‘p’ que aponta para uma constante de string.

A diferença aqui é que o primeiro ‘p’, sendo um array, você pode facilmente modificar ou alterar o conteúdo do array. Mas como o segundo ‘p’ está apontando para uma constante de string, você simplesmente não pode mudar o conteúdo da string.

Por exemplo, o seguinte trecho de código tenta modificar uma constante de string:

#include   
  
int main()  
{  
   char *p = "Eu gosto de HowToForge";  
   
   p[0] = 'U';  
   
   return 0;  
}

E aqui está a saída produzida por este código no meu sistema:

Falha de segmentação

Esse erro sugere que a execução do programa chegou a um fim abrupto, e isso porque tentamos mudar algo que é constante.

Além disso, tenha em mente que, enquanto o ponteiro ‘p’ pode ser feito para apontar para uma string diferente, você não pode mudar o endereço base do array ‘p’ (se você se lembra, já discutimos isso em um de nossos tutoriais anteriores).

Agora, passando para arrays de ponteiros, assim como você viu arrays de inteiros, caracteres e outros tipos, também pode haver um array de ponteiros. Por exemplo, o seguinte programa define um array ‘arr’ de ponteiros inteiros e atribui valores a ele.

#include   
  
int main()  
{  
 int *arr[3];  
 int a = 0, b = 1, c = 2;  
   
 arr[0] = &a;  
 arr[1] = &b;  
 arr[2] = &c;  
  
 return 0;  
}

Note que os valores atribuídos ao array são endereços. Isso porque ‘arr’ é um array de ponteiros, e ponteiros não armazenam nada além de endereços. Agora, se você quiser acessar os valores mantidos nesses endereços, você terá que usar o operador *.

O exemplo a seguir (que não é nada mais do que uma extensão do exemplo anterior) demonstra isso:

#include   
  
int main()  
{  
   int *arr[3];  
   int a = 0, b = 1, c = 2;  
   
   arr[0] = &a;  
   arr[1] = &b;  
   arr[2] = &c;  
   
   for(int i=0; i < 3; i++)  
      printf("\n arr[%d] é: %d",i,*(arr[i]));  
  
 return 0;  
}

Aqui está a saída:

arr[0] é: 0   
arr[1] é: 1   
arr[2] é: 2 

Semelhante aos arrays de ponteiros inteiros (como o que discutimos aqui), você pode ter arrays armazenando ponteiros de caracteres e mais.

Agora, vamos passar para ponteiros para ponteiros. Como já mencionamos várias vezes até agora, um ponteiro armazena um endereço. Agora, até agora nesta série de tutoriais de programação em C, só vimos um ponteiro apontando para uma variável não ponteiro, mas o fato é que os ponteiros também podem apontar para outros ponteiros.

Isso significa que um ponteiro pode armazenar um endereço de outro ponteiro. Por exemplo, o seguinte é um ponteiro duplo ou um ponteiro para ponteiro:

int **ptr;

Aqui está um trecho de código que utiliza um ponteiro duplo:

#include   
  
int main()  
{  
   int *ptr;  
   int p;  
   
   int a = 10;  
   
   ptr = &a;  
   
   p = &ptr;  
   
   printf("\n Ponteiro 'p' aponta para o ponteiro 'ptr' que por sua vez aponta para o valor: %d", p);  
   
   return 0;  
}

Aqui está a saída:

Ponteiro 'p' aponta para o ponteiro 'ptr' que por sua vez aponta para o valor: 10

Então, este foi um exemplo de um ponteiro duplo. Em linhas semelhantes, você pode ter um ponteiro para um ponteiro para um ponteiro, definido como, por exemplo, int *ptr. O número máximo de tais níveis de ‘ponteiro para ponteiro para……’ é específico da implementação (em alguns casos, o limite é 12, embora).

Na prática, no entanto, você provavelmente encontrará apenas ponteiros para ponteiros até o nível três, pois ter mais níveis torna a lógica mais complexa de entender e manter.

Conclusão

Discutimos três conceitos importantes relacionados a ponteiros aqui. Você é aconselhado a experimentar os exemplos e conceitos que discutimos aqui em seu sistema para ter uma melhor ideia de como essas coisas funcionam. Em caso de dúvida ou consulta, deixe-nos um comentário abaixo.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.