Estruturas de Dados
Prof. Vilson Heck Junior
Sobre Variáveis
• Aprendemos, em introdução à
programação, que possuem 3 partes mais
importantes:
– Nome;
– Tipo de Dado;
– Valor;
• Aprendemos,em estruturas de dados, que
elas possuem outra parte importante:
– Endereço/localização na memória!
Sobre Variáveis
• Com uma variável, precisamos nos
preocupar apenas com os três elementos
básicos, pois é o sistema operacional quem
se encarrega de gerenciar a posição de
memória;
• Mas em alguns momentos, precisaremos
trabalhar com o posicionamento dos dados
na memória;
• Para isto, serão introduzidos os termos:
– Ponteiros e Referências.
Atribuições:
Valores, Ponteiros e Referências
OS VALORES
Valores
• O Valor de uma variável, é o seu
conteúdo;
• Quando fazemos uma atribuição:
int x = 10;
int y = x;
– Estamos copiando um determinado valor,
ou o valor de uma outra variável, para
dentro da primeira.
10
10
Valores
• A operação de atribuição (sinal de
igualdade “=“) é a responsável por
efetuar a cópia destes valores;
• Todas as variáveis de tipo de dado
primitivo (int, double, etc..) fazem
atribuição de valor;
• Apesar de não ser um tipo de dado
primitivo, a String também irá fazer
atribuição por valor;
Atribuições:
Valores, Ponteiros e Referências
OS PONTEIROS
Ponteiros
• Vimos anteriormente que qualquer
variável possui um endereço na
memória;
–*variável
• Acessa o conteúdo da variável apontada;
Ponteiros
• Vantagens e Aplicações:
– Retorno de múltiplos dados em uma função;
– Informar a outro programa a área da memória
onde se encontram os dados necessários, sem
precisar fazer uma cópia;
• Isto deixa os programas mais rápidos e eficientes!
• Desvantagens:
– Pode causar constantes erros de acesso
indevido à memória, travando o computador;
– Tem o seu uso extremamente limitado ou até
inexistente em linguagens que utilizam
máquinas virtuais ou plataformas como .NET;
– Em geral, adicionam bastante complexidade à
implementação de um programa.
Atribuições:
Valores, Ponteiros e Referências
REFERÊNCIAS
Referências
• Linguagens de programação que visam o
desenvolvimento para uma determinada
plataforma, e não para um determinado
Sistema Operacional – como Java e .NET
– não contemplam o uso de ponteiros
em sua plenitude;
• Para contornar esta deficiência, existem
as referências!
Referências
• Algumas atribuições (em determinadas
linguagens de programação, tal como
Java) são feitas através de referência;
• Nesta forma de atribuição, ao invés de se
copiar o valor de uma variável para
outra, se associam os dois nomes de
variáveis à uma única efetiva variável na
memória.
Referências
• Este modo de atribuição não funciona
para variáveis de tipos de dados
primitivos (int, double, etc..), nem com
String;
class Carro {
public String Placa;
public int Ano;
}
Referências
• Atribuição por REFERÊNCIA:
public static void main(String[] args) {
Carro c1;
Carro c2;
c1 = new Carro();
c1.Placa = “ABC-1234”;
c1.Ano = 2010;
c2 = c1;
c2.Placa = “DFG-9876”;
c2.Ano = 1980;
System.out.println(“c1: “ + c1.Placa);
System.out.println(“c2: “ + c2.Placa);
}
Referências
null
Referências
• Atribuição por REFERÊNCIA:
public static void main(String[] args) {
Carro c1;
Carro c2;
c1 = new Carro();
c1.Placa = “ABC-1234”;
c1.Ano = 2010;
c2 = c1;
c2.Placa = “DFG-9876”;
c2.Ano = 1980;
System.out.println(“c1: “ + c1.Placa);
System.out.println(“c2: “ + c2.Placa);
}
null
Objeto Carro
Placa: DFG-9876
Ano: 1980
null
Referências
• Atribuição por REFERÊNCIA:
public static void main(String[] args) {
Carro c1;
Carro c2;
c1 = new Carro();
c1.Placa = “ABC-1234”;
c1.Ano = 2010;
c2 = c1;
c2.Placa = “DFG-9876”;
c2.Ano = 1980;
System.out.println(“c1: “ + c1.Placa);
System.out.println(“c2: “ + c2.Placa);
}
*ref*
Objeto Carro
Placa: DFG-9876
Ano: 1980
null
Referências
• Atribuição por REFERÊNCIA:
public static void main(String[] args) {
Carro c1;
Carro c2;
c1 = new Carro();
c1.Placa = “ABC-1234”;
c1.Ano = 2010;
c2 = c1;
c2.Placa = “DFG-9876”;
c2.Ano = 1980;
System.out.println(“c1: “ + c1.Placa);
System.out.println(“c2: “ + c2.Placa);
}
*ref*
Objeto Carro
Placa: DFG-9876
Ano: 1980
*ref*
Conclusão
• Existem três formas básicas de
atribuição;
• Cada forma de atribuição possui
aplicações diferentes que possibilitam
criar algoritmos diferentes;
• Atribuição por valor é a mais comum e
primeira aprendida;
Conclusão
• Atribuição por ponteiros não será
explorada, pois Java não contempla
ponteiros;
• Atribuição por referência será um
recurso muito importante e aplicado nas
estruturas de dados que deveremos
estudar a seguir.