Fórum Passagem de Parâmetro #422503

25/08/2012

0

Boa tarde pessoal,

Alguém poderia me explicar a diferença entre passagem de parâmetro

por valor e referência. Se puderem expor algum exemplo para que eu,

possa ter uma melhor compreensão.

Desde já agradeço.

Gustavo Fernandes

Gustavo Fernandes

Responder

Posts

25/08/2012

William

Colega postei um artigo explicando essas diferenças, segue link:
[url]https://www.devmedia.com.br/conceitos-basicos-sobre-procedures-e-functions-no-delphi/25303[/url]
Responder

Gostei + 0

25/08/2012

Joel Rodrigues

Olá, Gus.
Suponha um método que receba um valor e some uma unidade. Você pode, por exemplo, chamar o método passando um valor inteiro direto: Somar(10), mas pode também chamá-lo passando uma variável do seu código Sumar(valor).

Na segunda forma, você pode passar a variável "valor" como parâmetro, mas ao final do método, verá que a variável original não foi alterada. Essa variável foi passada POR VALOR. Vamos às definições conceituais:

Passagem POR VALOR:
a variável original não é alterada. O método que a recebe faz uma cópia da original e passa a trabalhar com a cópia.

Passagem POR REFERENCIA:
a variável original é manipulada pelo método, não uma cópia dela. Ao final da execução do método, a variável passada está alterada.

Exemplos:

Declaração de método com parâmetro por valor
procedure Somar(valor : integer)
begin
  valor := valor + 1;//a variável passada não é alterada nesse ponto
  ShowMessage(IntToStr(valor));
end;


Declaração de método com parâmetro por referência
procedure Somar(var valor : integer)
begin
  valor := valor + 1;//a variável passada é alterada nesse ponto
  ShowMessage(IntToStr(valor));
end;


Ao chamar o método, teríamos o seguinte:
var
numero : integer;
begin
numero := 1;
Somar(numero);
//após isso, a variável número continua com o valor 1


var
numero : integer;
begin
numero := 1;
Somar(var numero);
//após isso, a variável número contém o valor 2, pois foi alterada no método


Bom, a ideia é essa. Não sei se fui claro o bastante, mas caso as dúvidas persistam, fique à vontade para postar.

Abraço.
Responder

Gostei + 0

25/08/2012

Marco Salles

então o própri nome ja diz

passagem parãmetro por valor .. Vc passa o valor e nada ocorre com seu parãmetro

passagem parâmetro por referencia .. Vc passa a referencia e tudo que ocorrer afetará a variavel

O que confunde as vezes que o parâmetro var precede a passagem por Referencia e não por Valor

veja o exemplo


procedure Acrescentar(a:integer); // passagem por valor
begin
a:=a+5;
showmessage(inttostr(a));
end;


Ao chamar esta procedure veja o que acontece com a passagem do parâmetro por valor

var
b:integer
begin
b:=5; // variavel b recebe o valor de 5
Acrescentar(b); chamo a procedure me mostra a mensagem de 10;
showmessage('O Valor de b continua sendo ='+inttostr(b)); //continua sendo 5 pois passou-se por Valor
end;


Agora veja o mesmo exemplo utilizando a passagem por Referencia

procedure Acrescentar(var a:integer); // passagem por referencia . Perceba Diretriz VAR precedendo var a:integer
begin
a:=a+5;
showmessage(inttostr(a));
end;



Ao chamar esta procedure veja o que acontece com a passagem do parâmetro por valor

var
b:integer
begin
b:=5; // variavel b recebe o valor de 5
Acrescentar(b); chamo a procedure me mostra a mensagem de 10;
showmessage('O Valor de b Agora é  ='+inttostr(b)); //Veja que o Valor de B foi alterado
end;



dois adendos

1) quando se utiliza um quando se utiliza outro. Depende da sua necessiada

2) Todos os objetos em Delphi mesmo que vc não utiliza a diretriz VAR são passados por Referencia

Assim se vc tiver

procedure MudarCaption (butto:Tbutton);
begin
button.caprion:='Alterar';
end;


veja que não tem a Diretriz VAR , mas ao fazer


MudarCaptio(button1);


o Novo valor do caption do Objeto Button1 agora é Alterar

espero que tenha entendido a Biblia

[]sds
Responder

Gostei + 0

29/08/2012

Gustavo Fernandes

Obrigado pessoal estão me ajudando muito.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar