Vetor de ponteiros

Parece assunto repetido, mas não é: anteriormente, discutimos como podemos usar ponteiros para percorrer vetores e matrizes. Agora, veremos que podemos usar uma estrutura de dados homogênea, como um vetor, para armazenar diversos ponteiros.

Vetores de ponteiros

🧠 Teste seus conhecimentos

Qual é a afirmação correta sobre o uso de ponteiros e estruturas de dados homogêneas na programação?

  • A

    Ponteiros só podem ser usados para percorrer vetores, não matrizes.

  • B

    Não é possível armazenar ponteiros em estruturas de dados homogêneas.

  • C

    Vetores podem armazenar diversos ponteiros de forma homogênea.

  • D

    Matrizes são mais eficientes do que vetores para armazenar ponteiros.

  • E

    Estruturas de dados homogêneas não são adequadas para trabalhar com ponteiros.

👨‍💻 Criando um vetor de ponteiros

Para declararmos um vetor de ponteiros, usamos o seguinte comando:

tipo *vetorPont[tamanho];

Em um exemplo prático, temos o seguinte código:

#include<stdio.h>
#include<stdlib.h>

int main(void){
    int a = 5, b = 10, c = 30;
    int *vetPont[3] = { &a, &b, &c };

    for(int i = 0; i < 3; i++){
        printf("[%d] => %d\n", i, *vetPont[i]);
    }
    return 0;
}

Observe que o vetor, por ser declarado como um ponteiro, armazena os endereços de memória das variáveis a, b, e c. Ao percorremos o vetor, podemos utilizar tanto a abordagem tradicional (com []), quanto a aritmética de ponteiros (como será apresentado no exemplo a seguir).

Em ambos os casos, o operador de indireção (*) deve ser utilizado para indicar o interesse no conteúdo.

#include<stdio.h>
#include<stdlib.h>

int main(void){
    int a = 5, b = 10, c = 30;
    int *vetPont[3] = { &a, &b, &c };

    for(int i = 0; i < 3; i++){
        printf("[%d] => %d\n", i, *(*(vetPont)+i));
    }
    return 0;
}

🎩 Criando uma matriz de ponteiros

De forma análoga, podemos criar uma estrutura de dados homogênea do tipo matriz para armazenar um conjunto de ponteiros.

#include<stdio.h>

int main(void){
    int a = 5, b = 10, c = 30;
    int *mat[3][3] = {
        { &a, &b, &c},
        { &a, &b, &c},
        { &a, &b, &c}
    };
    
    printf("Acessando por []: \n");
    for(int i = 0; i < 3; i++){
        printf("%d %d %d\n", *(mat[i][0]), *(mat[i][1]), *(mat[i][2]));
    }
    
    printf("Acessando por aritmética: \n");
    for(int i = 0; i < 3; i++){
        printf("%d %d %d\n", *(*(*(mat+i)+0)), *(*(*(mat+i)+1)), *(*(*(mat+i)+2)));
    }
    
    return 0;    
}

📖 Bibliografia

Livros

  • Backes, A. (2018). Linguagem C - Completa e Descomplicada.