Passando Ponteiros para Funções
Parte da seção Logic & Flow do Journey de C da Coddy — lição 26 de 63.
Agora que você entende as limitações da passagem por valor, vamos explorar como passar ponteiros para funções resolve esse problema. Em vez de passar uma cópia do valor de uma variável, você pode passar o endereço de memória da variável para a função.
Quando você passa um ponteiro para uma função, a função recebe acesso à localização da variável original na memória. Isso significa que a função pode trabalhar diretamente com os dados originais, não apenas com uma cópia deles.
void processValue(int *ptr) {
// ptr contém o endereço da variável original
// A função agora pode acessar esse local de memória
}
int main() {
int x = 10;
processValue(&x); // Passa o endereço de x
return 0;
}Observe como usamos o operador de endereço & ao chamar a função para passar o endereço da variável. O parâmetro da função é declarado como int *ptr, indicando que ele espera receber um ponteiro para um inteiro. Esta técnica fundamental abre possibilidades poderosas para que as funções interajam com os dados do seu programa.
Desafio
FácilEscreva um programa em C que demonstre a passagem de ponteiros para funções. Seu programa deve:
- Criar uma função chamada
displayValueque recebe um ponteiro para um inteiro como seu parâmetro - Dentro da função
displayValue, usar o operador de desreferência para acessar o valor no endereço de memória e imprimi-lo no formato:Value at address: [value] - Na função
main, declarar uma variável inteira chamadanumbere inicializá-la com o valor 42 - Imprimir o valor original no formato:
Original value: [value] - Chamar a função
displayValuee passar o endereço da variávelnumberusando o operador address-of (&) - Após a chamada da função, imprimir uma mensagem de confirmação:
Function call completed
Sua saída deve demonstrar que a função recebe e acessa com sucesso o endereço de memória da variável original:
Original value: 42
Value at address: 42
Function call completedEste desafio introduz o conceito fundamental de passar ponteiros para funções, permitindo que a função acesse o local de memória da variável original em vez de trabalhar com uma cópia de seu valor.
Folha de consulta
Ao passar ponteiros para funções, a função recebe acesso ao local de memória da variável original em vez de uma cópia do seu valor.
Use o operador de endereço & para passar o endereço de uma variável para uma função:
void processValue(int *ptr) {
// ptr contém o endereço da variável original
// A função agora pode acessar esse local de memória
}
int main() {
int x = 10;
processValue(&x); // Passa o endereço de x
return 0;
}O parâmetro da função é declarado como int *ptr para indicar que ele espera receber um ponteiro para um inteiro.
Experimente você mesmo
#include <stdio.h>
// TODO: Escreva sua função displayValue aqui
int main() {
// TODO: Escreva seu código aqui
// 1. Declare e inicialize a variável number
// 2. Imprima o valor original
// 3. Chame a função displayValue
// 4. Imprima a mensagem de conclusão
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato