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