Use o botão abaixo para reportar erros ou dar sugestões.

Computação Científica - Um Livro Colaborativo

6.2 Passagem de parâmetros


Para entender como funciona a passagem de parâmetros, vamos trabalhar com um exemplo.

Exemplo 6.2.1. Implemente um programa que troca os valores de duas variáveis entre si.

Uma solução simples para o exemplo acima é implementar a troca direto no main.

#include <stdio.h>  
#include <math.h>  
 
void main(void)  
{  
  double a=2,b=3,tmp;  
  printf("a=%f, b=%f\n",a,b);  
  tmp=a;  
  a=b;  
  b=tmp;  
  printf("a=%f, b=%f\n",a,b);  
}

No entanto, suponha que gostaríamos de separar um função para fazer a troca. Então, a função entrar a e b e devolver com valores trocados. Teste o código abaixo:

#include <stdio.h>  
#include <math.h>  
 
void troca(double a,double b)  
{  
  double tmp=a;  
  a=b;  
  b=tmp;  
}  
 
void main(void)  
{  
  double a=2,b=3;  
  printf("a=%f, b=%f\n",a,b);  
  troca(a,b);  
  printf("a=%f, b=%f\n",a,b);  
}

Apesar de compilar e rodar sem erros, o código não faz o que queremos. Isso se deve ao fato que quando executamos um função, o programa separa uma parte da memória para o trabalho, faz cópia das valores do parâmetros de entrada, inicia variáveis locais, e, no fim da rotina, apaga toda a parte da memória usada para esse fim. Na prática, a função troca criou um espaço na memória, copiou os valores de a e b e trocou eles de lugar. Mas os valores de a e b nas posições originais não se alteraram. Isso de resolve se passarmos uma referência para a função e não um valor.

#include <stdio.h>  
#include <math.h>  
 
void troca(double *a,double *b)  
{  
  double tmp=*a;  
  *a=*b;  
  *b=tmp;  
}  
 
void main(void)  
{  
  double a=2,b=3;  
  printf("a=%f, b=%f\n",a,b);  
  troca(&a,&b);  
  printf("a=%f, b=%f\n",a,b);  
}

Agora, a função troca criou um ambiente e levou os endereços de a e b. Com os endereços, pudemos acessar os valores de a e b que estão fora desse ambiente e trocá-los de posição.

Em resumo, quando queremos apenas usar um parâmetro dentro de uma função, podemos passar o valor. Mas se queremos atualizar seu valor na passagem pela função, deveremos passar a referência.

Vamos refazer o mesmo exemplo de troca usando vetor de duas posições

#include <stdio.h>  
#include <math.h>  
 
void troca(double v[2])  
{  
  double tmp=v[0];  
  v[0]=v[1];  
  v[1]=tmp;  
}  
 
void main(void)  
{  
  double v[2]={2,3};  
  printf("a=%f, b=%f\n",v[0],v[1]);  
  troca(v);  
  printf("a=%f, b=%f\n",v[0],v[1]);  
}

Agora, nós passamos um vetor e o atualizamos, que parece contradizer aquilo que acabamos de dizer. Mas não se engane, quando usamos vetor, automaticamente o função já passa apenas a referência. Veja uma forma alternativa abaixo:

#include <stdio.h>  
#include <math.h>  
 
void troca(double *v)  
{  
  double tmp=*v;  
  *v=*(v+1);  
  *(v+1)=tmp;  
}  
 
void main(void)  
{  
  double v[2]={2,3};  
  printf("a=%f, b=%f\n",v[0],v[1]);  
  troca(v);  
  printf("a=%f, b=%f\n",v[0],v[1]);  
}

Exemplo 6.2.2. Implemente uma rotina para calcular a raíz de uma função pelo método de Newton passando o chute inicial e retornando a solução e o número de iterações necessárias.

#include <stdio.h>  
#include <math.h>  
 
double f(double x)  
{  
  return cos(x)-x;  
}  
double df(double x)  
{  
  return -sin(x)-1.;  
}  
 
void Newton(double x0, double tol, double *xn, int *k)  
{  
  double dif;  
  *k=0;  
  do  
  {  
  (*k)++;  
  *xn=x0-f(x0)/df(x0);  
  dif=fabs(*xn-x0);  
  x0=*xn;  
  }while (dif>tol);  
}  
 
 
void main(void)  
{  
  double x0=2,xn,tol=1e-10;  
  int k;  
  Newton(x0,tol,&xn,&k);  
  printf("Sol=%f, iterações=%d\n",xn,k);  
}

Creative Commons License Este texto é disponibilizado nos termos da licença Creative Commons Atribuição-CompartilhaIgual 3.0 Não Adaptada (CC-BY-SA 3.0). Página gerada em 19/8/2020 às 17:33:16.

Informe erros ou edite você mesmo!