Anda di halaman 1dari 34

Atribuições:

Valores, Ponteiros e Referências

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;

• Este endereço indica a posição da


memória onde se encontra o Valor da
variável;
Ponteiros
• Imagine agora um novo tipo de dado
para variáveis.
– Este tipo de dado, cujos valores não são
números, nem textos e nem valores lógicos,
mas sim, endereços de memória!
– Um ponteiro é uma variável que armazena o
endereço de memória onde se encontra
outra variável.
Ponteiros
• Um detalhe sobre a variável que é
apontada por um ponteiro, é que ela
sempre deve ter um tipo de dado;
• Neste caso - para o computador saber
interpretar o conteúdo da memória para
onde o ponteiro aponta - ele precisa
saber qual tipo de dado existe na
variável apontada.
Ponteiros
• Então, ao criarmos uma “variável
ponteiro”, além de indicar que ela será
um ponteiro, precisamos também indicar
qual o tipo de dado apontado:
• int x;
• int * y;
– Onde, x é uma variável inteira tradicional; e
– y é uma variável ponteiro para inteiro.
Ponteiros
• Abra o CodeBlocks;
• Crie um novo projeto “Console / C++”:
Ponteiros (C++)
int main()
{
int x;
int* y;
y = &x;
*y = 10;
cout << "Valor de x: " << x << endl;
cout << "Endereço de memória de x: " << y << endl;
x = 22;
cout << "Conteúdo apontado por y: " << *y << endl;
int** z;
z = &y;
cout << "Endereço de memória de y: " << z << endl;
return 0;
}
Ponteiros
• Modificadores e Acesso:
– tipo_de_dado*
• Cria um ponteiro para o tipo_de_dado;
– &variável
• Retorna o endereço de uma variável;

–*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;

• Elas funcionam para alguns tipos de


parâmetros de funções e para classes!
Referências
• Atribuição por VALOR:
public static void main(String[] args) {
int x = 10;
int y = x;
x = 5;
System.out.println(“Valor de X: “ + x);
System.out.println(“Valor de Y: “ + y);
}
Referências
• Atividade Prática: Crie a class:

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

• Os resultados dos algoritmos foram


diferentes devido à forma de atribuição:

– Classes fazem atribuição por referência.


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

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.

Anda mungkin juga menyukai