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.
🧠 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.