Paradygmaty
Paradygmaty
programowania
programowania
Wykład 3 – Zmienne
Pamięć
Pamięć
Pamięć – kolekcja komórek, z których każda posiada:
• unikalny adres
• stan
• zaalokowana
• niezalokowana
7
‘A’
?
1024
1040
1048
• niezalokowana
• zawartość
• wartość przechowywalna
• niezdefiniowana
?
Wartość przechowywalna – wartość, która może być
przechowywana w pojedynczej komórce pamięci
Zmienne
Zmienne
Zmienna – kontener dla wartości, która może być
sprawdzany i modyfikowany dowolną ilość razy
zmienne
zmienne
proste
złożone
Zmienne proste
Zmienne proste
Zmienna prosta – zmienna, która może zawierać
wartość przechowywalną. Każda zmienna prosta zajmuje
jedną komórkę pamięci
int funkcja()
int funkcja()
{
int x;
x = 5;
x = x+1;
return x;
}
?
6
5
Zmienne złożone
Zmienne złożone
Zmienna złożona – zmienna typu złożonego, zajmująca
kilka sąsiadujących komórek pamięci
struct Data
{
Data dzis;
Data daty[3];
{
int dzien;
int miesiac;
int rok;
};
11
3
2009
dzien
miesiac
rok
dzis
11
3
2009
12
3
2009
?
?
?
daty[0]
daty[1]
daty[2]
Kopiowanie przez wartość i przez referencje
Kopiowanie przez wartość i przez referencje
kopiowanie
przez
wartość
11
3
2009
?
?
?
dateA
dateB
11
3
2009
11
3
2009
dateA
dateB
dateB = dateA
kopiowanie
przez
referencje
11
3
2009
?
?
?
dateA
dateB
dateB = dateA
11
3
2009
?
?
?
dateA
dateB
Czas życia zmiennej
Czas życia zmiennej
Czas życia zmiennej jest przedziałem pomiędzy stworzeniem,
a zniszczeniem zmiennej
zmienne
zmienne
globalne
lokalne
na
stercie
Zmienne lokalne i globalne
Zmienne lokalne i globalne
Zmienna globalna – zmienna dostępna w dowolnym
miejscu w programie.
Czas jej życia jest równy czasowi działania aplikacji
Zmienna lokalna – zmienna zadeklarowana wewnątrz
procedury lub funkcji i dostępna tylko w wewnątrz tej
procedury lub funkcji.
Czas jej życia jest równy czasowi aktywacji
procedury lub funkcji
Zmienne lokalne i globalne
Zmienne lokalne i globalne
int globalna;
void funkcja1() {
int zmiennaLok1;
…
}
void funkcja2() {
int zmiennaLok2;
start
funkcja2()
powrót funkcja2
funkcja1()
powrót funkcja1
g
lo
b
a
ln
a
x
1
,
x
2
zm
ie
n
n
a
Lo
k2
zm
ie
n
n
a
Lo
k1
int zmiennaLok2;
…
funkcja1();
…
}
int main() {
int x1, x2;
funkcja2();
funkcja1();
return 0;
}
powrót funkcja2
funkcja1()
powrót funkcja1
stop
g
lo
b
a
ln
a
x
1
,
x
2
zm
ie
n
n
a
Lo
k1
Zmienne na stercie
Zmienne na stercie
Zmienna na stercie – zmienna anonimowa, tworzona
i niszczona w dowolnym momencie działania aplikacji.
Dostęp do zmiennej na stercie jest możliwy za pomocą
wskaźników
• tworzone są za pomocą alokatorów:
• tworzone są za pomocą alokatorów:
• C:
malloc()
• C++, C#, Java, ADA:
new
• niszczone są za pomocą delokatorów
• C:
free()
• C++:
delete
• C#, Java:
garbage collector
martwe wskaźniki !!!
Wiązanie
Wiązanie
Wiązanie – stałe przypisanie identyfikatora do jednostki
tj. wartość, zmienna, procedura, typ itd.
Środowisko – zbiór dostępnych wiązań.
int globalna;
int globalna;
void funkcja1() {
float x1 = 3.14;
x1++;
…
}
int main() {
int x1, x2;
funkcja1();
return 0;
}
globalna → zmienna typu int
funkcja1 → funkcja
x1 → liczba rzeczywista 3.14
globalna → zmienna typu int
funkcja1 → funkcja
main → funkcja
x1 → zmienna typu int
x2 → zmienna typu int
Zakres widoczności
Zakres widoczności
Zakres widoczności deklaracji – fragment programu,
w którym deklaracja jest dostępna.
Blok – jest to konstrukcja programu, ograniczająca
zakres widoczności dowolnej deklaracji wewnątrz niego
Struktura monolityczna
Struktura płaska
Struktura zagnieżdżona
deklaracja x1
deklaracja x2
deklaracja x3
deklaracja x1
deklaracja x1
deklaracja x2
deklaracja x3
deklaracja x2
deklaracja x3
Zakres widoczności
Zakres widoczności
void funkcja1() {
int zmiennaLok1 = 0;
printf(”%d”, zmiennaLok1);
for(int i=0; i<10; i++)
{
printf(”%f”, zmiennaLok1);
}
float zmiennaLok1 = 3.14;
const int s = 2;
int f(int x) {
return s*x;
}
void p(int y) {
printf(”%d”, f(y));
Zakrywanie
Zakresy statyczne i dynamiczne
}
printf(”%d”, zmiennaLok1);
}
printf(”%d”, f(y));
}
void q(int z) {
const int s = 3;
printf(”%d”, f(z));
}
void r(int z) {
const char s[] = ”ALA”;
printf(”%d”, f(z));
}
Reprezentacja zmiennych w pamięci
Reprezentacja zmiennych w pamięci
void funkcja1() {
int zmiennaLok1;
}
void funkcja2() {
int *wsk;
int zmiennaLok2;
wsk = new int[10];
ramka aktywacji
ramka aktywacji
ramka aktywacji
ramka aktywacji
sterta
wsk = new int[10];
funkcja1();
delete wsk;
}
int main() {
int x1, x2;
funkcja2();
funkcja1();
return 0;
}
ramka aktywacji
ramka aktywacji
ramka aktywacji
ramka aktywacji
ramka aktywacji
stos
dane
statyczne
zmienna lokalna
zmienna lokalna
zmienna lokalna
zmienna lokalna
dane porządkowe
void funkcja1() {
int zl1;
}
void funkcja2() {
int *wsk;
int zl2;
wsk = new int[10];
Reprezentacja zmiennych na stosie
Reprezentacja zmiennych na stosie
funkcja2()
powrót
funkcja2
funkcja1()
funkcja1()
powrót
funkcja1
x1
x2
x1
x2
wsk
x1
x2
wsk
x1
x2
x1
x2
zl1
x1
x2
wsk
wsk = new int[10];
funkcja1();
delete wsk;
}
int main() {
int x1, x2;
funkcja2();
funkcja1();
return 0;
}
zl2
wsk
zl2
wsk
zl2
zl1
zl1
wsk
Reprezentacja zmiennych na stercie
Reprezentacja zmiennych na stercie
int main() {
int *x1, *x2, *x3;
x1 =
x2 =
x3 =
delete x2;
x1
x2
x3
stos
sterta
new int;
new int;
new int;
delete x2;
delete x1;
return 0;
}