Compreendendo matrizes e ponteiros em C com exemplos claros e práticos

Última atualização: 27/05/2025
autor: Isaac
  • Matrizes e ponteiros compartilham uma relação próxima na linguagem C e podem ser usados ​​de forma equivalente em muitos cenários.
  • A aritmética de ponteiros permite que você percorra matrizes de forma eficiente e flexível.
  • Ponteiros são essenciais para manipulação avançada de memória e passagem de parâmetros por referência.
  • Strings em C são matrizes de caracteres terminadas com um caractere nulo '\0'.

c

Se você está começando agora a programar em C, ou se já programa há algum tempo e ainda se confunde com os conceitos de ponteiros e arrays, saiba que não está sozinho. Esses dois elementos fundamentais do C costumam causar confusão, principalmente porque seus comportamentos podem parecer semelhantes, mas apresentam diferenças importantes. Neste artigo, vamos detalhar esses conceitos, com explicações claras e exemplos simples que o ajudarão a dominá-los de uma vez por todas.

Neste conteúdo, você verá como os ponteiros permitem um gerenciamento de memória mais flexível e eficiente , aprenderá a usar arrays de variáveis ​​e ponteiros e descobrirá como tudo isso se integra ao lidar com funções, strings e estruturas mais complexas. Tudo é explicado de forma natural, prática e direta.

O que é um ponteiro em C?

ponteiro em c

Em C, um ponteiro é uma variável que armazena o endereço de memória de outra variável . Em vez de armazenar um valor diretamente, ele armazena a localização desse valor na memória.

A sintaxe básica para declarar um ponteiro é:

int variable;
int *puntero = &variable;

Onde & é o operador que obtém o endereço de memória e * é usado para acessar (ou desreferenciar) o conteúdo do endereço apontado.

Por exemplo:

int valor = 10;
int *p = &valor;
printf("%d", *p); // Imprime 10

Isso imprimirá o conteúdo do endereço armazenado em p , que é o valor da variável value.

Aritmética de ponteiros

Uma das características mais poderosas dos ponteiros é a possibilidade de realizar operações aritméticas com eles. Isso ocorre porque um ponteiro aponta para um endereço de memória e, ao incrementar ou decrementar esse ponteiro, a posição para a qual ele aponta se altera , levando em consideração o tamanho do tipo de dado para o qual ele aponta.

int array = {5, 10, 15};
int *ptr = array;

printf("%d", *(ptr + 1)); // Imprime 10

Esse comportamento torna a travessia de um array com um ponteiro muito simples e eficiente.

  Como corrigir problemas de saída HDMI no Windows 10

As operações básicas que você pode executar são:

  • Tarefa: int *ptr = array;
  • Desreferência: *ptr retorna o valor contido no endereço
  • Aumentar: ptr++ avançar para o próximo item
  • Subtração: permite que você saiba a distância entre dois ponteiros

Matrizes em C

matriz em c

Em C, um array é uma coleção de elementos do mesmo tipo localizados em posições de memória consecutivas . Ao declarar um array como:

int numeros = {1, 2, 3, 4, 5};

Internamente, os elementos são alinhados um após o outro na memória. O nome do array, como números , representa uma constante que aponta para o endereço do primeiro elemento. Ou seja:

numeros == &numeros

Por esse motivo, é possível usar ponteiros para acessar os elementos de um array . Isso possibilita técnicas como percorrer o array com um ponteiro:

int *ptr;
for(ptr = numeros; ptr < numeros + 5; ptr++) {
    printf("%d ", *ptr);
}

O que é exatamente o mesmo que fazer com índices.

Relação entre ponteiros e arrays

A relação entre matrizes e ponteiros é tão próxima que eles podem ser facilmente confundidos. Embora tecnicamente um array não seja um ponteiro, seu comportamento é muito semelhante ao de um quando usado como parâmetro para funções, por exemplo.

void imprimir(int *arr, int n) {
    for(int i = 0; i < n; i++) {
        printf("%d ", arr);
    }
}

Essa função pode ser chamada tanto com um array quanto com um ponteiro, porque ao passar um array para uma função, o que está sendo passado, na verdade, é o endereço do seu primeiro elemento.

Cadeias de caracteres em C

Em C, uma string é simplesmente uma matriz de tipos char que termina com o caractere especial '\0' (caractere nulo). Isso indica o fim da string.

Por exemplo:

char saludo[] = "Hola";

É equivalente a:

char saludo[] = {'H', 'o', 'l', 'a', '\0'};

Este caractere nulo habilita funções como strlen() saber quando parar.

Uma maneira comum de declarar uma string é usando um ponteiro:

char *mensaje = "Mensaje de prueba";

É necessário cuidado com essa abordagem, pois a sequência apontada pode estar em um segmento de memória somente leitura, tornando impossível modificar seu conteúdo.

  Como saber se alguém bloqueou seu número no iPhone

Ponteiros de função

Uma abordagem mais avançada, porém muito útil, é o uso de ponteiros de função . Em C, é possível armazenar o endereço de uma função em um ponteiro e, em seguida, chamá-la por meio desse ponteiro. Isso é especialmente útil em estruturas como callbacks ou algoritmos genéricos.

int suma(int a, int b) {
    return a + b;
}

int (*operacion)(int, int);
operacion = suma;
printf("%d", operacion(5, 3)); // Imprime 8

Isso oferece grande flexibilidade e é amplamente utilizado em estruturas como menus interativos ou estruturas orientadas a eventos.

Matrizes de ponteiros

Um array de ponteiros é simplesmente uma coleção de ponteiros ; ou seja, cada elemento do array é um ponteiro para um endereço de memória.

int a = 1, b = 2, c = 3;
int *arr_punteros;
arr_punteros = &a;
arr_punteros = &b;
arr_punteros = &c;

Assim, você pode acessar valores como:

printf("%d", *arr_punteros); // Imprime 1

Isso geralmente é usado para trabalhar com sequências de texto, como em matrizes de sequências de caracteres:

char *mensajes[] = {"Hola", "Mundo", "Adiós"};

E repetindo:

for(int i = 0; i < 3; i++) {
    printf("%s\n", mensajes);
}

Usando ponteiros em funções

Em C, as funções recebem seus argumentos por valor , o que significa que você trabalha com uma cópia. Se você quiser modificar o valor original de uma variável dentro de uma função, você deve passar um ponteiro para essa variável.

void cambiar(int *x) {
    *x = 100;
}

Chamando assim:

int valor = 50;
cambiar(&valor);
printf("%d", valor); // Imprime 100

Parâmetros da linha de comando

Em C, os programas podem receber argumentos em tempo de execução. Isto é conseguido com os parâmetros argc y argv[] em função main(). Além disso, você pode verificar como Use ponteiros em funções para gerenciar argumentos e melhore seu código.

int main(int argc, char *argv[]) {
    for(int i = 0; i < argc; i++) {
        printf("Argumento %d: %s\n", i, argv);
    }
}

argumento indica quantos argumentos foram passados ​​e argumento é uma matriz de ponteiros para char contendo os argumentos como strings.