Passagem de parâmetros - Parte 1

É muito provável que, em Algoritmos e Estruturas de Dados I, você tenha utilizado funções, um recurso extremamente útil para o desenvolvimento de soluções computacionais. O uso de funções propicia inúmeros benefícios para um programa, como a modularização e o reúso de software.

Lidando com funções

Embora existam funções que não recebem parâmetros, em diversas situações lidaremos com problemas que envolvem a passagem de parâmetros para uma função. Um clássico exemplo consiste na criação de uma função que recebe três notas de um estudante e calcula a média arimética. Vejamos o código:

Caso 1

#include<stdio.h>
#include<stdlib.h>

float calcularMedia(float n1, float n2, float n3){
    return (n1+n2+n3)/3;
}

int main(void){
    float nota1 = 5.0, nota2 = 7.0, nota3 = 10;
    float media = calcularMedia(nota1,nota2,nota3);
    printf("Média: %f", media);
}

E se resolvêssemos adaptar o programa, deixando o código da seguinte forma:

#include<stdio.h>
#include<stdlib.h>

void calcularMedia(float n1, float n2, float n3, float media){
    media = (n1+n2+n3)/3;
}

int main(void){
    float nota1 = 5.0, nota2 = 7.0, nota3 = 10, media = -1;
    calcularMedia(nota1,nota2,nota3,media);
    printf("Média: %f", media);
}

A saída do programa, agora, será diferente: -1. Mesmo que você não tenha assimilado os conceitos até aqui, já é possível perceber que a função calcularMedia parece não ter poderes para alterar valores das variáveis criadas na função main.

Caso 2

E se, ao invés de quatro variáveis, compartilhássemos um vetor de quatro posições com a função calcularMedia(), como mostra o código abaixo?

#include<stdio.h>
#include<stdlib.h>

void calcularMedia(float valores[]){
    valores[3] = (valores[0]+valores[1]+valores[2])/3;
}

int main(void){
    float notas[] = {5,7,10,0};
    calcularMedia(notas);
    printf("Média: %f", notas[3]);
}

Agora, a saída do programa volta a ser a média, de aproximadamente 7,3. Para entender porque o valor de media não mudou no caso anterior, mas foi alterado agora, precisamos entender como funciona a passagem de valores e a alocação de memória em programas de computador.