Função com passagem por referência

Por: Eduardo Casavella

Existem dois métodos de passagem de parâmetros para funções:

Passagem por valor – permite usar dentro de uma função uma cópia do valor de uma variável, porém não permite alterar o valor da variável original (somente a cópia pode ser alterada).

Passagem por referência – É passada para a função uma referência da variável, sendo possível alterar o conteúdo da variável original usando-se esta referência.

Na linguagem C a passagem por referência é implementada com o uso de ponteiros.

Usando ponteiros (também chamados de apontadores) é possível alterar os valores das variáveis passadas como argumentos para uma função.

A função utilizada dessa forma é denominada função com passagem por referência. Nesse tipo de função, os argumentos passam os endereços de memória para os parâmetros declarados na função. Sendo assim, os parâmetros que recebem os valores passados obrigatoriamente tem que ser ponteiros já que irão receber um endereço de memória.

A seguir temos o código fonte do exemplo mostrado no vídeo.

Exemplo 1 – Função com passagem por referência

#include <stdio.h>

//função que soma 10 ao valor recebido
void soma10(int x)
{
  x = x + 10;  
  printf("Valor de x apos a soma = %d \n",x);
  return;
}

void soma10p(int *x)
{
  *x = *x + 10;  
  printf("Valor de x apos a soma = %d \n",*x);
  return;
}

int main(void)
{
  int numero;
  printf("Digite um numero: ");
  scanf("%d", &numero);  
     
  printf("O numero digitado foi: %d \n",numero);  
  
  soma10(numero);  //chamada da função
  printf("Agora o numero vale: %d \n",numero);    
  
  soma10p(&numero);  //chamada da função com ponteiro como parâmetro
  printf("Agora o numero vale: %d \n",numero);  
  return 0;
}

As alterações feitas dentro da função tem efeito direto nas variáveis passadas como argumentos na chamada. Isto proporciona a oportunidade de retornar vários valores em uma única função já que as alterações ocorrem diretamente nas variáveis.

Veja outro exemplo a seguir onde usamos uma função com dois parâmetros por referência.

Exemplo 2 – função que troca de valores na main

O objetivo do programa abaixo é receber dois valores na main e depois, através de uma função fazer a troca dos valores recebidos nas variáveis sendo que estes valores já trocados devem ser mostrados dentro da main.

#include <stdio.h>
#include <conio.h>

//função com passagem por referência
//note que a função tem dois ponteiros como parâmetros
void troca_valores(int *ptrx, int *ptry);

int main(void)
{
	int a, b;
	printf("Digite o primeiro valor: ");
	scanf("%d", &a);
	
	printf("Digite o segundo valor: ");
	scanf("%d", &b);
	
	printf("Voce digitou os valores na seguinte ordem: %d e %d\n", a, b);
	
	/* Chamada da função que troca os valores das variáveis a e b.
	Observe como são passados os endereços nos argumentos.
	Esta é uma função chamada por referência */
	troca_valores(&a, &b);
	
	//Exibindo os valores já trocados após a chamada da função
	printf("Os valores trocados sao: %d e %d\n", a, b);
	
	getch();
	return 0;
}

//função que troca os valores inteiros apontados por ptrx e ptry
void troca_valores(int *ptrx, int *ptry)
{
	int auxiliar;
	
	//auxiliar recebe o conteúdo apontado por ptrx
	auxiliar = *ptrx;
	
	//coloca o valor que está no local apontado por ptry em ptrx
	*ptrx = *ptry;
	
	//finalmente, ptry recebe o valor armazenado em auxiliar
	*ptry = auxiliar;
	
	return;
}

 

Tela de Execução

tela de função com passagem

Tela de execução com passagem de parâmetros por referência.

Até a próxima!

3 respostas a Função com passagem por referência