Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Atribuições:Valores, Ponteiros e Referências
Estruturas de DadosProf. Vilson Heck Junior
Sobre Variáveis
• Aprendemos, em introdução àprogramação, que possuem 3 partes maisimportantes:
– Nome;
– Tipo de Dado;
– Valor;
• Aprendemos,em estruturas de dados, queelas possuem outra parte importante:
– Endereço/localização na memória!
Sobre Variáveis
• Com uma variável, precisamos nospreocupar apenas com os três elementosbásicos, pois é o sistema operacional quemse encarrega de gerenciar a posição dememória;
• Mas em alguns momentos, precisaremostrabalhar com o posicionamento dos dadosna memória;
• Para isto, serão introduzidos os termos:– Ponteiros e Referências.
OS VALORES
Atribuições:
Valores, Ponteiros e Referências
Valores
• O Valor de uma variável, é o seuconteú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, paradentro da primeira.
10
10
Valores
• A operação de atribuição (sinal deigualdade “=“) é a responsável porefetuar a cópia destes valores;
• Todas as variáveis de tipo de dadoprimitivo (int, double, etc..) fazematribuição de valor;
• Apesar de não ser um tipo de dadoprimitivo, a String também irá fazeratribuição por valor;
OS PONTEIROS
Atribuições:
Valores, Ponteiros e Referências
Ponteiros
• Vimos anteriormente que qualquervariável possui um endereço namemória;
• Este endereço indica a posição damemória onde se encontra o Valor davariável;
Ponteiros
• Imagine agora um novo tipo de dadopara variáveis.
– Este tipo de dado, cujos valores não sãonúmeros, nem textos e nem valores lógicos,mas sim, endereços de memória!
– Um ponteiro é uma variável que armazena oendereço de memória onde se encontraoutra variável.
Ponteiros
• Um detalhe sobre a variável que éapontada por um ponteiro, é que elasempre deve ter um tipo de dado;
• Neste caso - para o computador saberinterpretar o conteúdo da memória paraonde o ponteiro aponta - ele precisasaber qual tipo de dado existe navariável apontada.
Ponteiros
• Então, ao criarmos uma “variávelponteiro”, além de indicar que ela seráum ponteiro, precisamos também indicarqual 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, semprecisar 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 utilizammáquinas virtuais ou plataformas como .NET;
– Em geral, adicionam bastante complexidade àimplementação de um programa.
REFERÊNCIAS
Atribuições:
Valores, Ponteiros e Referências
Referências
• Linguagens de programação que visam odesenvolvimento para uma determinadaplataforma, e não para um determinadoSistema Operacional – como Java e .NET– não contemplam o uso de ponteirosem sua plenitude;
• Para contornar esta deficiência, existemas referências!
Referências
• Algumas atribuições (em determinadaslinguagens de programação, tal comoJava) são feitas através de referência;
• Nesta forma de atribuição, ao invés de secopiar o valor de uma variável paraoutra, se associam os dois nomes devariáveis à uma única efetiva variável namemória.
Referências
• Este modo de atribuição não funcionapara variáveis de tipos de dadosprimitivos (int, double, etc..), nem comString;
• Elas funcionam para alguns tipos deparâ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
null
Objeto CarroPlaca: DFG-9876
Ano: 1980
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*
null
Objeto CarroPlaca: DFG-9876
Ano: 1980
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*
*ref*
Objeto CarroPlaca: DFG-9876
Ano: 1980
Conclusão
• Existem três formas básicas deatribuição;
• Cada forma de atribuição possuiaplicações diferentes que possibilitamcriar algoritmos diferentes;
• Atribuição por valor é a mais comum eprimeira aprendida;
Conclusão
• Atribuição por ponteiros não seráexplorada, pois Java não contemplaponteiros;
• Atribuição por referência será umrecurso muito importante e aplicado nasestruturas de dados que deveremosestudar a seguir.