Menu
Coddy logo textTech

Passagem de Structs por Valor

Parte da seção Lógica e Fluxo do Journey de C da Coddy. Lição 46 de 63.

Agora que você sabe como trabalhar com structs e ponteiros para structs, é hora de aprender a passar structs inteiras para funções. Quando você passa uma struct para uma função como parâmetro, C usa passagem por valor, o que significa que a função recebe uma cópia completa da struct.

Aqui está a sintaxe de uma função que aceita um parâmetro do tipo struct:

void functionName(struct StructureName parameterName) {
    // Corpo da função
}

Usando nossa conhecida struct Point como exemplo:

void printPoint(struct Point p) {
    printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}

O conceito principal a entender é que quaisquer alterações que você fizer na struct dentro da função não afetarão a struct original na função chamadora. Isso ocorre porque a função trabalha com sua própria cópia dos dados.

Essa abordagem é útil quando você quer ler ou exibir dados de uma struct sem correr o risco de fazer modificações acidentais no original. No entanto, lembre-se de que copiar structs grandes pode ser ineficiente em termos de memória e desempenho.

challenge icon

Desafio

Fácil

Crie um programa em C que demonstre a passagem de structs para funções por valor. Seu programa deve:

  1. Definir uma struct chamada Rectangle com os seguintes membros:
    • Um inteiro width para armazenar a largura do retângulo
    • Um inteiro height para armazenar a altura do retângulo
    • Um array de caracteres color com tamanho 15 para armazenar a cor do retângulo
  2. Escrever uma função chamada displayRectangle que:
    • Receba uma struct Rectangle como parâmetro (passagem por valor)
    • Imprima as informações do retângulo neste formato exato:
      • Rectangle Details:
      • Width: [width]
      • Height: [height]
      • Color: [color]
      • Area: [area]
    • Calcule e imprima a área (largura × altura)
  3. Escrever uma função chamada modifyRectangle que:
    • Receba uma struct Rectangle como parâmetro (passagem por valor)
    • Dobre a largura e a altura do retângulo
    • Altere a cor para "Modified"
    • Imprima Inside modifyRectangle function:
    • Chame displayRectangle para mostrar o retângulo modificado
  4. Na função main:
    • Crie uma variável Rectangle chamada rect
    • Leia a largura, a altura e a cor da entrada e atribua-os aos membros da struct
    • Imprima Original rectangle:
    • Chame displayRectangle para mostrar o retângulo original
    • Chame modifyRectangle com o retângulo
    • Imprima After modifyRectangle call:
    • Chame displayRectangle novamente para mostrar que o retângulo original não foi alterado

Este desafio demonstra o conceito fundamental de passagem por valor com structs: quando você passa uma struct para uma função, a função recebe uma cópia completa da struct. Quaisquer modificações feitas dentro da função afetam apenas a cópia, não a struct original na função chamadora.

Experimente você mesmo

#include <stdio.h>
#include <string.h>

// TODO: Defina a struct Rectangle aqui

// TODO: Escreva a função displayRectangle aqui

// TODO: Escreva a função modifyRectangle aqui

int main() {
    // Ler entrada
    int width, height;
    char color[15];
    
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%s", color);
    
    // TODO: Criar a variável Rectangle e atribuir os valores de entrada
    
    // TODO: Imprimir "Original rectangle:" e chamar displayRectangle
    
    // TODO: Chamar modifyRectangle
    
    // TODO: Imprimir "After modifyRectangle call:" e chamar displayRectangle novamente
    
    return 0;
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo

Pratique por conta própria: Compilador de C online