Oi Joao, Se voce procurar em qualquer livro de programacao orientada por objetos vai encontrar a palavra "referencia" e nao "ponteiro". Nao eh a toa que isto ocorre, porque as linguagens de programacao, vou citar Delphi/Java, tem liberdade para internamente decidir como serah feito o acesso a um objeto. Se uma variavel definida, como no exemplo abaixo:
var x : TButton; fosse apenas um ponteiro, isto significaria que dentro da variavel "x" estaria fisicamente o endereco de onde a instancia (o objeto) da TButton esta na memoria. Ou seja: [x] ------------> botao A variavel "x" estaria apontado para as informacoes (atributos/metodos) do botao. Na verdade, no caso do Delphi, a representacao dos "apontamentos" seria algo parecido com o mostrado abaixo: [x]--------[uma estrutura em memoria]-------->[outra estrutura em memoria]-----......----> botao A variavel "x" esta apontado para o endereco de uma estrutura em memoria, que por sua vez possui o endereco de outras estruturas de memoria, sendo somente no final desta cadeia de apontamentos eh que as informacoes do botao podem ser encontradas. Ao usar o termo "referencia" os livros entendem que as implementacoes das linguagens de programacao tem toda a liberdade de usarem outras formas de acesso aos objetos, nao soh a forma de acesso direto (se fosse acesso direto seriam chamados de ponteiros). Por exemplo, ainda na linguagem Delphi: Quando um objeto eh criado, diversas estruturas de memoria sao criadas para representar este objeto. Uma destas estruturas eh a VMT (Virtual Method Table) que contem o endereco de todos os metodos da classe TButton (vou continuar usando o botao como exemplo mas vale para as demais classes) e o endereco de todos os metodos das classes ancestrais de TButton. Outra destas estruturas contem o endereco dos atributos de instancia. Outra estrutura estrutura teria o endereco dos atributos de classe, e por ai vai, formando uma cadeia de estruturas de memoria. Na linguagem Java, por outro lado, uma variavel definida como: Button x; Internamente a variavel "x" nao tem o endereco de memoria de nenhuma informacao (no caso o objeto botao). Na verdade, eh apenas um indentificador, porque os enderecos de memoria sao tratados e resolvidos internamente pela VM (maquina virtual) do Java. Logo, no caso do Java a variavel "x" nao eh sequer um ponteiro, porque nem possuir um endereco de memoria ela possui. A variavel "x" eh uma referencia. Por causa da possibilidade das implementacoes das linguagens, terem a total liberdade de decidirem como vao representar internamente o acesso aos objetos, eh que os livros usam as palavras "Referencia a objeto" e nao ponteiro. Usar o termo "ponteiro" implicaria que todas as definicoes de variaveis como : var x : TButton; // delphi Button x; // java obrigariam as linguagens a colocar dentro de "x" o endereco de memoria das informacoes dos objetos. Os "ponteiros" do delphi, por exemplo, nao possuem o endereco direto da informacao de um botao, mas o endereco de uma estrutura na memoria que apontam para diversas outras estruturas que somadas vao compor o objeto botao. Soh isso desclassifica a variavel "x" de ser chamada de ponteiro, porque ela nao aponta diretamente para onde a informacao (atributos e metodo) do objeto esta na memoria. Experimente tentar executar o codigo abaico e veja se o compilador nao irah "berrar": procedure TForm1.Button1Click(Sender: TObject); var s : string; begin s := TButton(Button1^).Name; end; Porque ele nao permite a deferencia acima (Button1^.Name)? Se "Button1" fosse um ponteiro nao deveria permitir este tipo de acesso ao atributo "Name" ? Afinal, se "Button1" fosse um ponteiro, e usando a sintaxe do Delphi para deferenciamento de ponteiros, este "ponteiro" deveria permitir acessar um de seus atributos. Tanto nao eh um ponteiro que o compilador nao permitie este tipo de comando, justamente porque "Button1" nao eh um ponteiro, eh uma referencia. A linuagem Java jah eh outro exemplo de que a variavel "x", do exemplo anterior, nao eh um ponteiro porque sequer esta variavel tem dentro de si enderecos de memoria, mas apenas identificadores que sao criados, e tratados internamente pela JVM. Por isso eh que eu escrevi que "x" nao deve ser classificado como ponteiro, mas sim como uma "referencia a objeto". Desculpem, mas este e-mail foi maior ainda que o anterior. ----- Original Message ----- From: "Joao Morais" <[EMAIL PROTECTED]> To: <delphi-br@yahoogrupos.com.br> Sent: Wednesday, March 02, 2005 11:49 PM Subject: Re: [delphi-br] Ponteiros > > Clayton Bonelli wrote: > >> Desculpe ser chato quanto a isso, ou mesmo muito purista do conceito. >> >> Vejamos o seguinte: por definicao um ponteiro corresponde ao endereco >> onde >> uma informacao se encontra na memoria, sendo assim, uma declaracao como a >> seguinte: >> >> var >> x : ^Integer; >> >> significa que a variavel "X" possui dentro de si, o endereco onde um >> integer >> (a informacao) esta localizado na memoria. >> >> Por outro lado, a definicao abaixo: >> >> var >> x : TButton; >> >> significa que "x" eh uma referencia, nao um ponteiro, para uma instancia >> da >> class TButton. Qual a diferenca entre referencia de objetos e ponteiros? >> Ponteiro aponta para onde a informacao esta na memoria. Referencia de >> objetos eh um endereco que PODE ser o local na memoria onde a informacao >> esta localizada, como PODE ser o endereco de uma estrutura de memoria que >> conteria o endereco do botao (TButton). Eh a implementacao da linguagem >> que >> vai determinar se uma referencia de objeto funciona exatamente igual ao >> conceito de um ponteiro, ou a referencia conteria dentro de si o endereco >> de >> alguma outra coisa. Esta outra coisa seria uma estrutura que conteria o >> endereco da informacao. Dizer que um objeto eh um ponteiro nao esta >> totalmente correto. Se for pensar apenas que ponteiros e referencias de >> objeto, possuem dentro de si enderecos de memoria, entao os conceitos sao >> iguais. Mas, se formos analisar a semantica da coisa toda, os conceitos >> sao >> diferentes. >> >> Resumindo de forma mais simples: Um ponteiro aponta diretamente para a >> informacao; Uma referencia de objetos, seria um ponteiro de ponteiros. >> >> Desculpe pel e-mail tao grande > > Clayton, > > uma classe é um ponteiro porque aponta para um objeto. Um objeto não é > ponteiro, objeto é objeto. Você está certo ao dizer que uma classe pode > apontar para algo que não é exatamente um TButton (citando seu exemplo), > mas irá apontar para uma estrutura semelhante (uma super-classe de > TButton), mas aponta, o alvo será um objeto, portanto o seu 'x' será um > ponteiro. > > Eu ainda acabei por não compreender direito o que você quer dizer com > referência de objetos. Pra mim, dizer 'uma referência a uma instância de > TButton' é o mesmo que dizer 'um ponteiro para uma instância de TButton' > (ou seja, para um objeto). Estou utilizando os conceitos do Object Pascal. > > > -- > João Morais > > > -- > <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> > > Para ver as mensagens antigas, acesse: > http://br.groups.yahoo.com/group/delphi-br/messages > > Para falar com o moderador, envie um e-mail para: > [EMAIL PROTECTED] ou [EMAIL PROTECTED] > > Links do Yahoo! Grupos > > > > > > > > > > > > > -- > No virus found in this incoming message. > Checked by AVG Anti-Virus. > Version: 7.0.300 / Virus Database: 266.5.4 - Release Date: 1/3/2005 > > -- No virus found in this outgoing message. Checked by AVG Anti-Virus. Version: 7.0.300 / Virus Database: 266.5.4 - Release Date: 1/3/2005 -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html