Qual é a melhor forma de utilizar ponteiros?

1. Qual é a melhor forma de utilizar ponteiros?

J4ne D0bbs
j4ned0bbs

(usa Slackware)

Enviado em 08/03/2026 - 17:01h

Eu sei, é uma pergunta meio boba mas eu venho me questionando.

Estive estudando recentemente C por que eu gosto bastante de C mas bem no inicio estudando sobre ponteiros eu fiquei me perguntando qual é a melhor aplicação para se usar ponteiros e para que eles ajudariam/serviriam.

Peguem leve ksksk, eu ainda sou meio leiga sobre programação de "baixo nivel" e ainda to estudando quando posso.


  


2. Re: Qual é a melhor forma de utilizar ponteiros?

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 08/03/2026 - 19:46h

O uso mais básico de ponteiros é quando vc tem uma quantidade de dados e precisa passar pra funções MAS não quer copiar os dados como parâmetro da função:
struct DadosDeExemplo {
char nome[2048];
};
//suponha agora que vc tem a seguinte função que retorna um struct DadosDeExemplo:
struct DadosDeExemplo lerDados() {
struct DadosDeExemplo dados;
printf("Digite o nome completo de dom Pedro I:\n");
fgets(dados.nome, 2048, stdin);
return dados;
}
int main() {
struct DadosDeExemplo dados;
dados = lerDados();
return 0;
}


A função lerDados é altamente ineficiente, sabe por que? Porque ela retorna uma cópia da struct DadosDeExemplo!
Apesar da função ser sintaticamente e semanticamente correta, ela é muito ineficiente porque ao chamar a lerDados, é alocada memória pra "dados" DENTRO dela e em seguida, os dados são populados e por fim, retornada OUTRA CÓPIA da variável dados!

Percebeu como é lenta a parada?

Um jeito de resolver isso é passando um ponteiro para então o ponteiro ser populado indiretamente, vou modificar, veja abaixo:
struct DadosDeExemplo {
char nome[2048];
};
//suponha agora que vc tem a seguinte função modificada que apenas modifica o parametro dados
void lerDados(struct DadosDeExemplo *dados) {
//aqui dentro, dados é uma área de memoria FORA de lerDados!
printf("Digite o nome completo de dom Pedro I:\n");
fgets(dados->nome, 2048, stdin);
}
int main() {
//cria a vairável local
struct DadosDeExemplo dados;
//passa o endereço de dados para lerDados
lerDados(&dados);
//aqui os dados estão populados
return 0;
}


E qual a diferença de um pro outro? Basicamente vc evitou duas cópias de uma struct gigante como a "DadosDeExemplo"!
Ou seja, seu código passou ficar ultra otimizado! Cria só uma vez os dados e ai popula ele só uma vez também.

Esse é o uso mais básico de ponteiros: fazer referência indireta para dados pré alocados pra evitar ter de copiá-los.

E quando utilizar ponteiros?
Vc usa quando TEM de evitar copiar dados para funções ou quando vc precisa que uma função modifique um dado externo DENTRO dela, como o caso acima.



______________________________
https://tutorpro-sam.blogspot.com/ acessa ai, é grátis!


3. Re: Qual é a melhor forma de utilizar ponteiros?

Gustavo Samuel Bacagine Azevedo
Bacagine

(usa Arch Linux)

Enviado em 09/03/2026 - 11:47h

Sou desenvolvedor C há 7 anos, e em todos esses anos, duas maneiras de usar ponteiros me chamaram atenção.

Os conceitos a seguir são avançados, algumas coisas que vou falar não são abordadas muito em livros ou em cursos por aí, então não se preocupe se tiver dificuldades em entender.

1) Ponteiros Genéricos (void*)
Os ponteiros genéricos (void pointers) são usados quando você não sabe qual tipo de dado vai ser usado. Imagine que você cria uma estrutura de lista, e ao invés de definir qual dado será salvo na lista, você cria uma lista com ponteiro genérico, assim ela passa a aceitar qualquer tipo de dado.


typedef struct STRUCT_GENERIC_LIST {
void* pData;
struct STRUCT_GENERIC_LIST* pstNext;
} STRUCT_GENERIC_LIST, *STRUCT_GENERIC_LIST;


2) Callbacks (ponteiros para funções)
Esse é um dos usos que eu mais vejo no dia a dia, trabalhando como desenvolvedor C na empresa onde estou.
Imagine que você está desenvolvendo uma biblioteca que tem uma função que precisa chamar outra, porém você não sabe o conteúdo dessa função que você vai chamar, você não tem essa função no seu código, a única coisa que você sabe é a assinatura que essa função tem. Nesse caso, você cria uma callback, um ponteiro para a função, assim quando um desenvolvedor usar sua biblioteca, ele irá passar a função como parâmetro para este ponteiro.
Veja um exemplo a seguir:


typedef int (*PFNCALLBACK)(void);
void vMyFunction(PFNCALLBACK pfnCallback);


1) Criamos um tipo de dado que é um ponteiro de função chamado PFNCALLBACK.
2) Criamos uma função que recebe como parâmetro uma função com a assinatura de PFNCALLBACK, ou seja, uma função que retorna um inteiro e não recebe parâmetros.

O desenvolvedor que for chamar a função vMyFunction terá que passar como parâmetro uma função que tenha essa assinatura. Exemplo:


int iHelloWorld(void) {
puts("Hello World!!!");
puts("I'm a callback :)");
return 1;
}

int main(void) {
vMyFunction(iHelloWorld);
return 0;
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts