Passagem por Valor
Parte da seção Logic & Flow do Journey de C da Coddy — lição 25 de 63.
Quando você passa uma variável para uma função em C, a função recebe uma cópia do valor dessa variável, não a variável em si. Este conceito fundamental é chamado de passagem por valor.
Aqui está o que acontece: se você tiver uma variável x com o valor 10 e a passar para uma função, a função recebe sua própria cópia separada desse valor. Quaisquer alterações que a função fizer nesta cópia não afetam a variável original de volta na função chamadora.
void tryToChange(int num) {
num = 99; // Isso altera apenas a cópia
}
int main() {
int x = 10;
tryToChange(x);
// x ainda é 10, não 99
return 0;
}Este comportamento protege seus dados originais de serem modificados acidentalmente por funções. No entanto, isso também significa que, se você quiser que uma função realmente altere o valor de uma variável, a passagem por valor (pass-by-value) não funcionará. Compreender essa limitação é crucial à medida que você avança para aprender sobre ponteiros e como eles podem resolver esse problema.
Desafio
FácilEscreva um programa em C que demonstre o conceito de passagem por valor ao tentar modificar uma variável dentro de uma função e observar que a variável original permanece inalterada.
Seu programa deve:
- Criar uma função chamada
tryToModifyque recebe um parâmetro inteiro chamadonumber - Dentro da função
tryToModify, adicionar 50 ao parâmetronumber - Dentro da função
tryToModify, imprimir o valor modificado no formato:Inside function: [value] - Na função
main, declarar uma variável inteira chamadaoriginale inicializá-la com o valor 25 - Imprimir o valor original antes de chamar a função no formato:
Before function call: [value] - Chamar a função
tryToModifye passar a variáveloriginalcomo argumento - Após a chamada da função, imprimir o valor de
originalnovamente no formato:After function call: [value]
Sua saída deve demonstrar que o valor da variável original permanece inalterado, apesar da modificação dentro da função:
Before function call: 25
Inside function: 75
After function call: 25Este desafio demonstra o conceito fundamental de passagem por valor em C, onde as funções recebem cópias das variáveis em vez das próprias variáveis. Quaisquer modificações feitas no parâmetro dentro da função não afetam a variável original na função chamadora.
Folha de consulta
Em C, as funções recebem uma cópia dos valores das variáveis, não as variáveis em si. Isso é chamado de passagem por valor.
Quando você passa uma variável para uma função, qualquer alteração feita dentro da função afeta apenas a cópia, deixando a variável original inalterada:
void tryToChange(int num) {
num = 99; // Isso altera apenas a cópia
}
int main() {
int x = 10;
tryToChange(x);
// x ainda é 10, não 99
return 0;
}Esse comportamento protege seus dados originais de serem modificados acidentalmente por funções, mas significa que a passagem por valor não funcionará se você quiser que uma função realmente altere o valor de uma variável.
Experimente você mesmo
#include <stdio.h>
// TODO: Escreva sua função tryToModify aqui
int main() {
// TODO: Escreva seu código aqui
// 1. Declare e inicialize a variável original
// 2. Imprima o valor antes da chamada da função
// 3. Chame a função tryToModify
// 4. Imprima o valor após a chamada da funçã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