Wykład 8 Zmienna Instrukcja podstawienia Czas istnienia nazwy

Transkrypt

Wykład 8 Zmienna Instrukcja podstawienia Czas istnienia nazwy
Zmienna
Wykład 8
Aspekty zmiennej:
• nazwa
• adres (lokacja)
• wartość
• typ
• rozmiar
• Zmienna i jej aspekty
• Zmienna wskaźnikowa
• Przydział pamięci dla zmiennych
• Działania na zmiennych wskaźnikowych
• Zastosowanie typu wskaźnikowego
• Przykłady
32000
var
x:byte;
begin
...
x:=234;
...
end.
32005
234
Czas istnienia nazwy
Instrukcja podstawienia
kompilacja
zmienna := wyrażenie
z1 := z2 := z3 := wyrażenie (podstawienie wielokrotne)
z1:=: z2
(podstawienie symetryczne)
z op := wyr
z := z op wyr
a,b = wyr1,wyr2
(podwójne podstawienie)
Program w Pascalu
Program wykonywalny
nazwa zmiennej
adres w pamięci
procedure main()
i:=5; j:=7; k:=11
nazwa:=read()
m:=variable(nazwa)
write(m)
variable(nazwa):=3
write(j)
end
Adres zmiennej
Pascal
zmienna
adres
(dostarcza adres zmiennej)
#j
#7
Język Icon
#3
Zmienna wskaźnikowa
Język C
addr(x)
@x
&x
a^
*a
Zmienna wskaźnikowa - zmienna, która przechowuje
adres innej zmiennej.
Zmienna wskazywana - zmienna, na którą wskazuje
zmienna wskaźnikowa.
p
adres
zmienna
7
Deklaracja zmiennej wskaźnikowej:
var
x:real; absolute adres;
var
p : ^integer;
begin
...
p^ := 7;
end;
p
7
1
Alokacje i zwalnianie pamięci
Zmienna wskaźnikowa i wskazywana
var
p,q : ^integer;
begin
...
p^ := 3;
q^ := 5;
...
end;
p
q
p := q
type
punkt=record
x,y:real;
end;
5
var
p : ^punkt;
p^ := q^
p
3
q
3
5
p
q
5
5
Operacje na zmiennych wskaźnikowych
alokacja zmiennej: new(p);
zwalnianie pamięci: dispose(p);
przypisanie: :=
operacje logiczne: = <>
wartość „pusta”: nil
dostęp: a^.x[3]^[7].b
begin
new(p);
...
P^.x := 2.0;
p^.y := 3.0;
...
dispose(p);
...
p := nil;
end;
• Zmienne dużych rozmiarów
• Nieregularne struktury danych:
– stos, kolejka, talia, lista
– drzewo
– graf
p
{2}
p
?
?
{3}
p
2.0
3.0
{4}
p
{5}
p
?
{1}
{2}
{3}
{3}
?
{4}
{5}
nil
Przydział pamięci
0000
Kod programu
• statyczny
• dynamiczny ze stosu (stack)
• dynamiczny ze sterty (heap)
Zm. statyczne
Sterta
typ pointer (Turbo Pascal, FPC)
GetMem(var p:pointer; size:word)
freeMem(var p:pointer; size:word)
Zastosowania typu wskaźnikowego
{1}
Stos
FFFF
Tworzenie łańcucha odsyłaczowego (listy)
type pnode = ^node;
node = record;
w : integer;
next : pnode;
end;
var first,p :pnode;
i,s : integer;
begin
first:=nil;
for i:=1 to n do
begin
read(s); new(p);
p^.next:=first;
p^.w:=s;
first:=p;
end;
end.
Etapy tworzenia listy:
first
nil
first
2
nil
first
5
2
nil
first
7
...
5
2
nil
2
Zastosowanie nieregularnych struktur danych
Iteracyjnie
W(x)=x^4+5x^3-7x^2+x+3
0
3
type
wielom=array[0..max]of real
1
1
2
-7
3
5
4
1
5
0
W(x)=x^10001-5x^737+8x^31+4
type
link=^node;
node=record
wsp:integer;
wyk:inetger;
next:link;
end;
Wypisanie wartości wielomianu
w
10001
737
31
0
1
-5
8
4
Procedure wypisz1(p:link);
begin
while p<>nil do
begin
if p^.wsp>0 then write(‘+’);
write(p^.wsp,’x^’,p^.wyk);
p:=p^.next;
end;
end;
nil
Wypisanie wartości wielomianu
Rekurencyjnie
Procedure wypisz2(p:link);
begin
if p<>nil do
begin
if p^.wsp>0 then write(‘+’);
write(p^.wsp,’x^’,p^.wyk);
wypisz2(p^.next);
end;
end;
Wstawianie elementu do listy
procedure wstaw(var first:pnode; m:pnode; wart:integer);
var r : pnode;
begin
new(r); r^.w:=wart;
if m=first then
begin
r^.next:=first; first:=r;
end
else
begin
p:=first;
while first^.next<>m do
first:=first^.next;
r^.next:=first^.next;
first^.next:=r;
first:=p;
end;
Usuwanie elementu z listy
procedure usun(var first : pnode; m : pnode);
var r : pnode;
begin
if m=first then
begin
first:=first^.next;
dispose(m);
end
else
begin
r:=first;
while r^.next<>m do
r:=r^.next;
r^.next:=m^.next;
dispose(m);
end;
end;
3