# Referência (ciência da computação)

Em ciência da computação, uma referência é um objeto que contém informação que indica dados armazenados em algum outro local ao invés de conter o próprio dado. Acessar o valor referenciado pela referência chama-se "dereferenciar". Referências são fundamentais para construir várias estruturas de dados (como uma lista ligada), e para transportar informação entre diferentes partes de um programa de computador.
Genericamente, uma referência pode ser considerada como um pedaço de dado que permite a obtenção de outro pedaço de dado. Isso inclui uma chave primária de um banco de dados e as chaves de mapa (um vetor associativo chave → valor).

## Analogia

Uma referência pode ser comparada ao endereço de uma residência. Ela é um pequeno identificador com o qual é possível encontrar um objeto potencialmente muito maior. Encontrar uma residência a partir de seu endereço é como dereferenciar uma referência.
Em um exemplo mais complexo, suponha que você deixa um endereço de redirecionamento em sua antiga residência cada vez que você realiza uma mudança. Uma pessoa pode visitar sua residência original (a primeira), e então seguir as instruções de redirecionamento para a nova residência (a segunda), e assim por diante até finalmente encontrar sua atual residência. Esse processo é análogo a como as referências são utilizadas em listas ligadas.

## Benefícios

As referências aumentam a flexibilidade do local onde os objetos são armazenados, como são alocados e como são passados e usados entre diferentes áreas de código. Desde que se possa acessar uma referência para o dado, não é necessário mover o dado em si. É mais simples também compartilhar dados entre diferentes áreas de código, desde que cada área mantenha uma referência ao dado.
O mecanismo de referência é, ainda que variado de acordo com a implementação, uma funcionalidade fundamental em linguagens de programação, comum em quase todas as linguagens modernas. O ponteiro é a implementação mais primitiva e passível a erros, mas também a mais poderosa e eficiente, armazenando somente o endereço de um objeto em memória. Ponteiros inteligentes são estruturas de dados opacas que agem como ponteiros, mas que possuem informação adicional (metadados), que garantem mais segurança.
Um handle é uma implementação de referência usada para abstrair fluxos de dados como arquivos de computador. Ele representa tanto o fluxo em si (todo o objeto) quanto uma posição específica do conteúdo no qual a leitura se encontra no momento.

## Armazenamento externo e interno

Em várias estruturas de dados, grande e complexos objetos são compostos de objetos mais simples. Tais objetos são tipicamente armazenados internamente ou externamente. Com armazenamento interno, o conteúdo do objeto menor é armazenado no objeto maior. Com armazenamento externo, os objetos menores são armazenados em sua própria locação, e os objetos maiores possuem somente referências a eles. A alternativa interna é geralmente mais eficiente, pois existe custo de armazenamento das referências e a alocação dinâmica dos dados, e por causa do custo para dereferenciar a referência para acessar os objetos menores. Armazenar internamente também aumenta o princípio da localidade ao manter diferentes partes de um mesmo grande objeto no mesmo local de memória.
Entretanto, existe uma variedade de situações em que o armazenamento externo é preferível, incluindo quando a estrutura de dados é recursiva, quando o objeto maior é armazenado em uma área com espaço limitado e quando o objeto menor pode variar de tamanho, forçando o redimensionamento do objeto maior caso esteja internamente. De forma geral, referências são mais fáceis de se trabalhar, adaptando-se melhor na ocorrência de novos requisitos.
Algumas linguagens não suportam armazenamento interno, como Java (linguagem de programação) e Scheme, de forma que nelas todos os objetos são acessados através de referências.

## Igualdade

Em linguagens nas quais todos os objetos são acessados através de referências é necessário testar dois tipos diferentes de igualdade: se duas referências referenciam o mesmo objeto; se objetos distintos referenciados por duas referências são iguais de alguma forma (mesmo conteúdo). O primeiro tipo implica o segundo, mas a recíproca não é verdadeira.

## Referências simbólicas

Algumas linguagens, como Perl, suportam referências simbólicas, que são apenas valores em string que contêm nomes de variáveis. Quando um valor que não é uma referência regular é desreferenciado, na linguagem Perl considera esse valor como uma referência simbólica. Outra linguagem, PHP, também tem um formato semelhante na sintaxe $$var .