Variáveis
Prof: Sergio Souza Costa

Adaptado de © 2004, Programming Language Design Concepts
D.A. Watt, University of Glas...
Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor em Computação Aplicada (INPE)
prof.sergio.costa@gmail.com

https://si...
Roteiro
● Modelo simples de armazenamento.
● Variáveis simples e compostas.
● Atribuição: Cópia Vs referência.
● Tempo de ...
Variáveis e Armazenamento
Comandos
Expressões com efeitos colaterais
Implementação
Variáveis
O conceito de variável depende do paradigma de
programação.
Variáveis
O conceito de variável depende do paradigma de
programação.
Em linguagens logicas e funcionais (como na matemáti...
Variáveis
O conceito de variável depende do paradigma de
programação.
Em linguagens logicas e funcionais (como na matemáti...
Variáveis
O conceito de variável depende do paradigma de
programação.
Em linguagens logicas e funcionais (como na matemáti...
Variável pode ser visto como
uma quádrupla:
(endereço, identificador, tipo, valor)
Variável pode ser visto como
uma quádrupla:
(endereço, identificador, tipo, valor)
Variáveis
int a, b;
a = 10;
b = 5;
Endereço Identificador Tipo
1000
a
int
1004
b
int

Valor
10
5
Armazenamento - Modelo
● Considere o seguinte
modelo de armazenamento:
○ Uma memoria (store) é uma
coleção de células, ond...
Variáveis simples e compostas
Um valor simples é aquele que pode ser armazenado em uma
única célula (tipicamente um valor ...
Variáveis simples
Quando uma variável simples é declarada, uma célula é
reservada para ela.
Variáveis simples
Quando uma variável simples é declarada, uma célula é
reservada para ela.
Atribuição, atualiza o valor d...
Variáveis simples
Quando uma variável simples é declarada, uma célula é
reservada para ela.
Atribuição, atualiza o valor d...
Variáveis simples
Quando uma variável simples é declarada, uma célula é
reservada para ela.
Atribuição, atualiza o valor d...
Variáveis simples
Quando uma variável simples é declarada, uma célula é
reservada para ela.
Atribuição, atualiza o valor d...
Variáveis simples
Quando uma variável simples é declarada, uma célula é
reservada para ela.
Atribuição, atualiza o valor d...
Variáveis simples
Quando uma variável simples é declarada, uma célula é
reservada para ela.
Atribuição, atualiza o valor d...
Variáveis simples
Quando uma variável simples é declarada, uma célula é
reservada para ela.
Atribuição, atualiza o valor d...
Variáveis simples
Quando uma variável simples é declarada, uma célula é
reservada para ela.
Atribuição, atualiza o valor d...
Variável composta
Uma variável de um tipo composto tem a mesma estrutura,
como o valor do tipo. Por exemplo:
●
●

Um regis...
Variável composta
declare
type Date is
record
y: Year_Number;
m: Month;
d: Day_Number;
end record;
xmas, today: Date;
begi...
Variável composta
declare
type Date is
record
y: Year_Number;
m: Month;
d: Day_Number;
end record;
xmas, today: Date;
begi...
Variável composta
declare
type Date is
record
y: Year_Number;
m: Month;
d: Day_Number;
end record;
xmas, today: Date;
begi...
Variável composta
declare
type Date is
record
y: Year_Number;
m: Month;
d: Day_Number;
end record;
xmas, today: Date;
begi...
Variável composta
declare
type Date is
record
y: Year_Number;
m: Month;
d: Day_Number;
end record;
xmas, today: Date;
begi...
Variável composta
declare
type Date is
record
y: Year_Number;
m: Month;
d: Day_Number;
end record;
xmas, today: Date;
begi...
Variável composta
declare
type Date is
record
y: Year_Number;
m: Month;
d: Day_Number;
end record;
xmas, today: Date;
begi...
Atualização total ou por seleção
Uma variável composta é totalmente atualizado, se isso é feito
em um único passo:
struct ...
Arrays, estáticos, dinamicos, flexiveis
Array estático é quando os limites dos seus índices são fixados
no código do progr...
Exemplo C: Array estático
float v1[] = {2.0, 3.0, 5.0, 7.0};
float v2[10];

...
void print_vector (float v[], int n) {
// ...
Exemplo Ada: Array dinâmico
type Vector is
array (Integer range <>) of Float;
v1: Vector(1 .. 4) := (1.0, 0.5, 5.0, 3.5);
...
Exemplo Java: Array flexível
Array variable declarations:
float[] v1 = {1.0, 0.5, 5.0, 3.5};
float[] v2 = {0.0, 0.0, 0.0};...
Questão
Em Java, um array é flexível pois na verdade um array é um ponteiro para
um objeto, que tem todos seus componentes...
Array em outras linguagens
Lua, "arrays" são dinâmicos e flexíveis. Similar a Java, tambem
são ponteiros para objetos.
fun...
Semânticas de atribuição
O que exatamente acontece quando um valor composto é associado
a uma variável do mesmo tipo ?
Cóp...
Exemplo Ada: Cópia
type Date is
record
y: Year_Number;
m: Month;
d: Day_Number;
end record;
dateA: Date := (2004, jan, 1);...
Exemplo Ada: Cópia
type Date is
record
y: Year_Number;
m: Month;
d: Day_Number;
end record;
dateA: Date := (2004, jan, 1);...
Exemplo Ada: Cópia
type Date is
record
y: Year_Number;
m: Month;
d: Day_Number;
end record;
dateA: Date := (2004, jan, 1);...
Exemplo Java: Referência
class Date {
int y, m, d;
public Date (int y, int m, int d) { … }
}
Date dateR = new Date(2004, 1...
Exemplo Java: Referência
class Date {
int y, m, d;
public Date (int y, int m, int d) { … }
}
Date dateR = new Date(2004, 1...
Simulando referência
Em Ada ou C, conseguimos o efeito de referência usando
ponteiros. Em Ada, por exemplo:
type Date_Poin...
Simulando cópia
O efeito de cópia pode ser alcançado em Java ou outras
linguagens, clonando o objeto:
Date dateR = new Dat...
Questão
Como faço para simular referência para objetos primitivos em
Java, JavaScipt, Lua ... ?
Atividade: Simulem esse ti...
Copia vs Referência
Em chamadas de funções, a mesma semântica se aplica, dado
que quando chamamos uma função estamos fazen...
Tempo de vida
Toda variável é criada (ou alocada) em um dado momento
e destruída (ou desalocada) em outro momento.
Este te...
Tempo de vida
O tempo de vida das variáveis globais é a execução do
programa.
O tempo de vida de uma variável local é o bl...
Exemplo C: variáveis globais e locais
int g;
void main () {
int x1; float x2;
. . . P(); . . . Q(); . . .
}
void P () {
fl...
Exemplo JavaScript: variáveis globais e
locais
Em JavaScript uma variavel local é declarado com a palavra
reservada "var",...
Exemplo Lua: variáveis globais e locais
Similarmente, em Lua existe a palavra reservada "local":
function f ()
local a = 1...
Exemplo Lua: variáveis globais e locais
Similarmente, em Lua existe a palavra reservada "local":
function f ()
local a = 1...
Variáveis Heap
O heap é uma coleção de células organizada esparsamente na
memória.
Uma variável heap não tem identificador...
Variáveis Heap
Em C++, o operador de alocação new usa um nome de tipo como operando.
Em C é o malloc.
Ao ser executado, um...
Variáveis Heap - C++
Exemplo:
int *intnode; // Cria um ponteiro
...
intnode = new int; // Cria a variável
...
delete intno...
Exemplo Ada. Variáveis Heap
procedure main is
type IntNode;
type IntList is access IntNode;
type IntNode is record
elem: I...
Exemplo Ada. Variáveis Heap

● Após chamada e retorno de B:
primes

2

3

5

odds

7

heap
variables

● Após chamada e ret...
Heap - Acessibilidade
Uma variável heap é dita ser acessível se ela pode ser
acessada por variáveis ponteiros, local ou gl...
Ponteiros
Um ponteiro é uma referência a uma dada variavel, as vezes chamado de
referência.
Um ponteiro nulo é um tipo esp...
Exemplo C - Ponteiros
Expliquem o que está acontecendo, no código abaixo:
long int a, b;
a = 10;
b = (long int)&a;
*((int*...
Exemplo C - Ponteiros
Expliquem o que está acontecendo, no código abaixo:
long int a, b;
a = 10;
b = (long int)&a;
*((int*...
Exemplo C - Ponteiros
Expliquem o que está acontecendo aqui:
struct Point { int x; int y;};
...
struct Point p;
*((int*)(&...
Exemplo C - Ponteiros
Expliquem o que está acontecendo aqui:
struct Point { int x; int y;};
...
struct Point p;
*((int*)(&...
Exemplo C - Ponteiros
Expliquem o que está acontecendo aqui:
struct Point { int x; int y;};
...
void* pg;
pg = (int*)mallo...
Dangling pointer (ponteiro orfão)
Um dangling pointer é um ponteiro para uma variável que não existe
mais.
Considerem este...
Dangling pointer (ponteiro orfão)
C é inseguro, uma variável heap é destruída e seu ponteiro
continua existindo podendo se...
Ponteiros - Atividade
Ponteiros são valores de primeira classe em C. Essa
característica dá uma grande flexibilidade a lin...
Próximos SlideShares
Carregando em…5
×

Variáveis

566 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
566
No SlideShare
0
A partir de incorporações
0
Número de incorporações
13
Ações
Compartilhamentos
0
Downloads
20
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Variáveis

  1. 1. Variáveis Prof: Sergio Souza Costa Adaptado de © 2004, Programming Language Design Concepts D.A. Watt, University of Glasgow
  2. 2. Sobre mim Sérgio Souza Costa Professor - UFMA Doutor em Computação Aplicada (INPE) prof.sergio.costa@gmail.com https://sites.google.com/site/profsergiocosta/home http://www.slideshare.net/skosta/presentations?order=popular https://twitter.com/profsergiocosta http://gplus.to/sergiosouzacosta
  3. 3. Roteiro ● Modelo simples de armazenamento. ● Variáveis simples e compostas. ● Atribuição: Cópia Vs referência. ● Tempo de vida. ● Ponteiros.
  4. 4. Variáveis e Armazenamento Comandos Expressões com efeitos colaterais Implementação
  5. 5. Variáveis O conceito de variável depende do paradigma de programação.
  6. 6. Variáveis O conceito de variável depende do paradigma de programação. Em linguagens logicas e funcionais (como na matemática), uma variável é um valor fixo, porém desconhecido.
  7. 7. Variáveis O conceito de variável depende do paradigma de programação. Em linguagens logicas e funcionais (como na matemática), uma variável é um valor fixo, porém desconhecido. Em linguagens imperativas (procedural ou OO), uma variável é um contêiner para valores, que podem ser acessados e atualizados.
  8. 8. Variáveis O conceito de variável depende do paradigma de programação. Em linguagens logicas e funcionais (como na matemática), uma variável é um valor fixo, porém desconhecido. Em linguagens imperativas (procedural ou OO), uma variável é um contêiner para valores, que podem ser acessados e atualizados. Tais variáveis podem ser usadas para modelar objetos do mundo real que mudam seus valores no tempo.
  9. 9. Variável pode ser visto como uma quádrupla: (endereço, identificador, tipo, valor)
  10. 10. Variável pode ser visto como uma quádrupla: (endereço, identificador, tipo, valor)
  11. 11. Variáveis int a, b; a = 10; b = 5; Endereço Identificador Tipo 1000 a int 1004 b int Valor 10 5
  12. 12. Armazenamento - Modelo ● Considere o seguinte modelo de armazenamento: ○ Uma memoria (store) é uma coleção de células, onde cada célula tem um endereço único. ○ Cada célula ou está alocada ou desalocada. ○ Cada célula contem um valor ou é indefinida (vulgarmente conhecido como lixo) não alocado 7 true 3.14 ? ‘X’ alocado indefinido
  13. 13. Variáveis simples e compostas Um valor simples é aquele que pode ser armazenado em uma única célula (tipicamente um valor primitivo ou pointeiro) Uma variável simples ocupa uma única célula Uma variável composta ocupa um grupo contíguos de célula.
  14. 14. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela.
  15. 15. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula.
  16. 16. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada.
  17. 17. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end;
  18. 18. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end;
  19. 19. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end; ? n
  20. 20. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end; 0 n
  21. 21. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end; 1 n
  22. 22. Variáveis simples Quando uma variável simples é declarada, uma célula é reservada para ela. Atribuição, atualiza o valor da célula. Fim do bloco, a área é desalocada. declare n: Integer; begin n := 0; n := n+1; end;
  23. 23. Variável composta Uma variável de um tipo composto tem a mesma estrutura, como o valor do tipo. Por exemplo: ● ● Um registro é uma tupla de variáveis componentes. Uma array é um mapeamento entre uma faixa de indices para um grupo de variáveis componentes. Variáveis componentes podem ser inspecionadas e atualizadas, totalmente ou seletivamente.
  24. 24. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end;
  25. 25. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end;
  26. 26. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end; xmas today ? ? ? ? ? ?
  27. 27. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end; xmas today ? ? ? ? 25 ?
  28. 28. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end; xmas today ? ? dec ? 25 ?
  29. 29. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end; xmas today 2004 ? dec ? 25 ?
  30. 30. Variável composta declare type Date is record y: Year_Number; m: Month; d: Day_Number; end record; xmas, today: Date; begin xmas.d := 25; xmas.m := dec; xmas.y := 2004; today := xmas; end; xmas today 2004 2004 dec dec 25 25
  31. 31. Atualização total ou por seleção Uma variável composta é totalmente atualizado, se isso é feito em um único passo: struct Point {int x; int y;}; ... struct Point p = {10, 5}; Ou seletivamente: struct Point p; p.x = 10;
  32. 32. Arrays, estáticos, dinamicos, flexiveis Array estático é quando os limites dos seus índices são fixados no código do programa, ou seja, seu tamanho é definido em tempo de compilação. Array dinâmico é quando seus índices são fixadas no momento que a variável do array é criada. ○ Em Ada, a definição do tipo do array é fixa, mas não necessário definir os seus limites. Somente quando um array é criado que é definido os seus limites. Arrays flexíveis além de dinâmicos, podem ter seus limites alterado depois de uma atribuição;
  33. 33. Exemplo C: Array estático float v1[] = {2.0, 3.0, 5.0, 7.0}; float v2[10]; ... void print_vector (float v[], int n) { // Print the array v[0], …, v[n-1] in the form “[… … …]”. int i; printf("[%f8.2", v[0]); for (i = 1; i < n; i++) printf(" %f8.2", v[i]); printf("]"); } … print_vector(v1, 4); print_vector(v2, 10);
  34. 34. Exemplo Ada: Array dinâmico type Vector is array (Integer range <>) of Float; v1: Vector(1 .. 4) := (1.0, 0.5, 5.0, 3.5); v2: Vector(0 .. m) := (0 .. m => 0.0); ... procedure print_vector (v: in Vector) is -- Print the array v in the form “[… … …]”. begin put('['); put(v(v'first)); for i in v'first + 1 .. v'last loop put(' '); put(v(i)); end loop; put(']'); end print_vector; … print_vector(v1); print_vector(v2);
  35. 35. Exemplo Java: Array flexível Array variable declarations: float[] v1 = {1.0, 0.5, 5.0, 3.5}; float[] v2 = {0.0, 0.0, 0.0}; … v1 = v2; static void printVector (float[] v) { // Print the array v in the form “[… … …]”. System.out.print("[" + v[0]); for (int i = 1; i < v.length; i++) System.out.print(" " + v[i]); System.out.print("]"); } … printVector(v1); printVector(v2);
  36. 36. Questão Em Java, um array é flexível pois na verdade um array é um ponteiro para um objeto, que tem todos seus componentes. Quando fazemos uma atribuição estamos mudando um ponteiro? Então, array em C são ponteiros ? Então são flexíveis ?
  37. 37. Array em outras linguagens Lua, "arrays" são dinâmicos e flexíveis. Similar a Java, tambem são ponteiros para objetos. function printVetor (v) for i, v in pairs (v) do print (i, v) end end v1 = {10,5,6}; v2 = {10,5,6, 10, 15} v2 = v1 printVetor(v2)
  38. 38. Semânticas de atribuição O que exatamente acontece quando um valor composto é associado a uma variável do mesmo tipo ? Cópia, todos os componentes são copiados para a variável destino. Referência, a variável composta é um ponteiro ou referencia para o valor composto, uma atribuição muda essas referências. C e Ada adotam cópia. Java, JavaScript, Lua .. adota para valores primitivos, mas referência para objetos.
  39. 39. Exemplo Ada: Cópia type Date is record y: Year_Number; m: Month; d: Day_Number; end record; dateA: Date := (2004, jan, 1); dateB: Date; dateB := dateA; dateB.y := 2005; dataA dateB 2004 ? jan ? 1 ?
  40. 40. Exemplo Ada: Cópia type Date is record y: Year_Number; m: Month; d: Day_Number; end record; dateA: Date := (2004, jan, 1); dateB: Date; dateB := dateA; dateB.y := 2005; dataA dateB 2004 2004 jan jan 1 1
  41. 41. Exemplo Ada: Cópia type Date is record y: Year_Number; m: Month; d: Day_Number; end record; dateA: Date := (2004, jan, 1); dateB: Date; dateB := dateA; dateB.y := 2005; dataA dateB 2004 2005 jan jan 1 1
  42. 42. Exemplo Java: Referência class Date { int y, m, d; public Date (int y, int m, int d) { … } } Date dateR = new Date(2004, 1, 1); Date dateS = new Date(2004, 12, 25); dateR dateS 2004 2004 1 12 1 25 dateS = dateR; dateR.y = 2005;
  43. 43. Exemplo Java: Referência class Date { int y, m, d; public Date (int y, int m, int d) { … } } Date dateR = new Date(2004, 1, 1); Date dateS = new Date(2004, 12, 25); dateR dateS = dateR; dateR.y = 2005; 2004 1 1 dateS
  44. 44. Simulando referência Em Ada ou C, conseguimos o efeito de referência usando ponteiros. Em Ada, por exemplo: type Date_Pointer is access Date; Date_Pointer dateP = new Date; Date_Pointer dateQ = new Date; … dateP.all := dateA; dateQ := dateP;
  45. 45. Simulando cópia O efeito de cópia pode ser alcançado em Java ou outras linguagens, clonando o objeto: Date dateR = new Date(2004, 4, 1); dateT = dateR.clone();
  46. 46. Questão Como faço para simular referência para objetos primitivos em Java, JavaScipt, Lua ... ? Atividade: Simulem esse tipo de referência em Java.
  47. 47. Copia vs Referência Em chamadas de funções, a mesma semântica se aplica, dado que quando chamamos uma função estamos fazendo atribuições para as variáveis locais das funções. Esta afirmação é válida para a estratégia call-by-value. Por que linguagens funcionais purais devem usar a estratégia call-byname (avaliação preguiçosa) ?
  48. 48. Tempo de vida Toda variável é criada (ou alocada) em um dado momento e destruída (ou desalocada) em outro momento. Este tempo entre a criação ou destruição, é conhecido como tempo de vida da variável. Uma variável ocupa celulas na memoria somente durante o seu tempo de vida.
  49. 49. Tempo de vida O tempo de vida das variáveis globais é a execução do programa. O tempo de vida de uma variável local é o bloco a qual pertence. O tempo de vida de uma variável heap é arbitrário, limitado pela tempo de execução do programa. Ela pode ser criada e destruída (em geral) em qualquer momento. Seu acesso é feito através de ponteiros. ○ Diferentemente das variáveis locais e globais ela nao tem um identificador, somente endereço.
  50. 50. Exemplo C: variáveis globais e locais int g; void main () { int x1; float x2; . . . P(); . . . Q(); . . . } void P () { float y1; int y2; . . . Q(); . . . } // continuação void Q () { int z; . . . }
  51. 51. Exemplo JavaScript: variáveis globais e locais Em JavaScript uma variavel local é declarado com a palavra reservada "var", caso contrário ela é global. A variavel "a" é local e a "b" é global. function f () { var a = 10; b = 5;} Não existe variável local a bloco em JavaScript: function f () { if (true) { var b = 10; } console.log (b) // b é local a f; }
  52. 52. Exemplo Lua: variáveis globais e locais Similarmente, em Lua existe a palavra reservada "local": function f () local a = 10 b = 5; end f(); print (a, b) Já em Lua, existem variáveis locais a blocos: function f () if (true) then local a = 10 end print (a) end f()
  53. 53. Exemplo Lua: variáveis globais e locais Similarmente, em Lua existe a palavra reservada "local": function f () local a = 10 b = 5; end f(); print (a, b) Nestas linguagens dinâmicas as variáveis Já em Lua, existem variáveis locais a blocos: só existem a partir do momento que são function f () if (true) then local a = 10 end usadas. print (a) end f()
  54. 54. Variáveis Heap O heap é uma coleção de células organizada esparsamente na memória. Uma variável heap não tem identificador, apenas um endereço. ○ Uma variável de referência ou ponteiro é usada para acessar uma variável dinâmica do heap explícita
  55. 55. Variáveis Heap Em C++, o operador de alocação new usa um nome de tipo como operando. Em C é o malloc. Ao ser executado, uma var. din. do heap explícita é criada e um ponteiro para ela é criado. A vinculação da variável ao tipo de dados é feita em tempo de compilação A vinculação da variável ao armazenamento é feita em tempo de execução Algumas linguagens fornecem tanto um operador de alocação quanto de desalocação. ○ Em Java, não existe função para desalocar.
  56. 56. Variáveis Heap - C++ Exemplo: int *intnode; // Cria um ponteiro ... intnode = new int; // Cria a variável ... delete intnode; // Desaloca a variável
  57. 57. Exemplo Ada. Variáveis Heap procedure main is type IntNode; type IntList is access IntNode; type IntNode is record elem: Integer; succ: IntList; end record; odds, primes: IntList := null; function cons (h: Integer; t: IntList) return IntList is begin return new IntNode'(h, t); end; procedure A is begin odds := cons(3, cons (5, cons(7, null))); primes := cons(2, odds); end; procedure B is begin odds.succ := odds.succ.succ; end; begin … A; … B; … end;
  58. 58. Exemplo Ada. Variáveis Heap ● Após chamada e retorno de B: primes 2 3 5 odds 7 heap variables ● Após chamada e retorno de B: primes 2 3 5 7 odds sem referencia
  59. 59. Heap - Acessibilidade Uma variável heap é dita ser acessível se ela pode ser acessada por variáveis ponteiros, local ou global. O tempo de vida de uma variável extende da sua criação até: ○ ser destruída por um operador de desalocação, ex. delete ou free ○ quando ela se torna inacessível (coletor de lixo) ○ termino do programa.
  60. 60. Ponteiros Um ponteiro é uma referência a uma dada variavel, as vezes chamado de referência. Um ponteiro nulo é um tipo especial de valor de ponteiro que não se refere a nenhuma linguagem. Um ponteiro é essencialmente uma variavel cujo valor são endereços para outra variável na memória. Entretanto, cada ponteiro tem também um tipo que permite o compilador inferir o tipo da variável a qual ela aponta. int *p; Então, (*p) é do tipo inteiro.
  61. 61. Exemplo C - Ponteiros Expliquem o que está acontecendo, no código abaixo: long int a, b; a = 10; b = (long int)&a; *((int*)b) = 50; printf ("%d %ldn", a, b);
  62. 62. Exemplo C - Ponteiros Expliquem o que está acontecendo, no código abaixo: long int a, b; a = 10; b = (long int)&a; *((int*)b) = 50; Em printf ("%d %ldn", a, b); C, uma variável ponteiro é como qualquer outra, possui valores e operadores específicos (*, &, +)
  63. 63. Exemplo C - Ponteiros Expliquem o que está acontecendo aqui: struct Point { int x; int y;}; ... struct Point p; *((int*)(&p) ) = 20; *((int*)(&p) + 1 ) = 50; printf ("%d %d n",p.x, p.y);
  64. 64. Exemplo C - Ponteiros Expliquem o que está acontecendo aqui: struct Point { int x; int y;}; ... struct Point p; *((int*)(&p) ) = 20; *((int*)(&p) + 1 ) = 50; Similar printf ("%d %d n",p.x, p.y); a um array, um struct é uma área contígua da memória.
  65. 65. Exemplo C - Ponteiros Expliquem o que está acontecendo aqui: struct Point { int x; int y;}; ... void* pg; pg = (int*)malloc (sizeof (int)); (*(int*)pg) = 10; printf ("%d n", *(int*)pg); pg = realloc (pg, sizeof(struct Point)); (*(int*)pg) = 50; printf ("%d n", (*(struct Point*)pg).x);
  66. 66. Dangling pointer (ponteiro orfão) Um dangling pointer é um ponteiro para uma variável que não existe mais. Considerem este programa em C, o que está acontecendo aqui? int f (int **p) { int a; a = 10; *p = &a; } int f3 () { int b; printf ("%dn", b); } main () { ... f(&q); printf (">> %d n", *q); *q = 50; f3(); ... }
  67. 67. Dangling pointer (ponteiro orfão) C é inseguro, uma variável heap é destruída e seu ponteiro continua existindo podendo ser acessado por uma variável global, por exemplo. Ada é seguro, pois variáveis globais não podem armazenar ponteiros locais. Java é muito seguro, você não tem acesso direto aos ponteiros.
  68. 68. Ponteiros - Atividade Ponteiros são valores de primeira classe em C. Essa característica dá uma grande flexibilidade a linguagem. Com o uso do ponteiro genérico void* e ponteiros para função. Façam uma pesquisa sobre programação genérica em C usando este mecanismo e montem alguns exemplos.

×