background image

Paradygmaty 

Paradygmaty 

programowania

programowania

Wykład 3 – Zmienne

background image

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

background image

Zmienne

Zmienne

Zmienna – kontener dla wartości, która może być 

sprawdzany i modyfikowany dowolną ilość razy

zmienne

zmienne

proste

złożone

background image

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

background image

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]

background image

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

background image

Czas życia zmiennej

Czas życia zmiennej

Czas życia zmiennej jest przedziałem pomiędzy stworzeniem,

a zniszczeniem zmiennej

zmienne

zmienne

globalne

lokalne

na

stercie

background image

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

background image

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

background image

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 !!!

background image

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

background image

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

background image

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));

background image

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

background image

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

background image

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;

}