You are on page 1of 33

Hernyák Zoltán

Web: http://dragon.ektf.hu/aroan, E-Mail: aroan@aries.ektf.hu

Magasszintű
Programozási Nyelvek I.
Eszterházy Károly Főiskola
Számítástudományi tsz
http://aries.ektf.hu

1
Érték-típusok Típusok

Egészek

Valósak
Logikai

Karakter

String
Referencia-
típusok

Tömbök

Rekordok
Listák
2
Value type (érték-típus)

int a;

• Deklarál egy új azonosítót („a”)


• Tartalmazza, hogy az új azonosító egy
„egész szám tárolására képes” változó
• A memóriában azonnal területet foglal le
neki (4 byte)
• Az „a” –ban helyezett értéket
közvetlenül ezen a memóriaterületen
fogja tárolni
3
Value type (érték-típus)
4 byte

50

Írási művelet erre a


a=50; memóriaterületre.

Olvasási művelet erről


int b=a*2; a memóriaterületről.

4
Value type (érték-típus)

Egészek
Érték-típusok

Valósak

Logikai

Karakter

• Vagyis a fenti típusú változók a


fentiekben ismertetett módon kerülnek
kezelésre.

5
Reference type (referencia-típus)

class Hallgato
{
public int eletkor;
public string neve;
public bool ferfi;
}

Hallgato h;

6
Reference type (referencia-típus)

Hallgato h;

• Deklarál egy új azonosítót („h”)


• Tartalmazza, hogy az új azonosító egy
„egész hallgató tárolására képes”
változó
• A memóriában azonnal területet foglal le
neki (de mennyit ???)

7
Reference type (referencia-típus)

Hallgato h;
4 byte

null

• 4 byte-on egy memóriacímet lehet


eltárolni
• A „null” egy speciális memóriacím, azt
jelenti SEHOL (ÜRES, SEMMI)
8
Reference type (referencia-típus)
Referencia-

String
típusok

Tömbök

Osztályok

• Vagyis a fenti típusú változók a


fentiekben ismertetett módon kerülnek
kezelésre.

9
Reference type (referencia-típus)

h = new Hallgato();
4 byte 1 db Hallgato számára elég byte

1 eletkor | nev | ferfi

h 1

• new <- memóriafoglalás


• Hallgato() <- feltöltés kezdőértékekkel

10
Reference type (referencia-típus)

h.eletkor = 20;

1 eletkor | nev | ferfi

h <- keresd meg a


memóraterületet
h. <- kövesd a linket
h.eletkor <- tárold el az értéket
11
Reference type (referencia-típus)

Nem működik, mert


Hallgato h; a ‘null’ linket nem
h.eletkor = 20; lehet követni !

Nem működik, hacsak


Hallgato h; ‘eletkor’ nevű változónk
eletkor = 20; nincsen önnmagában!

Hallgato h = new Hallgato();


h.eletkor = 20;
Ez működik, mert addigra lesz a memóriában
Hallgató, és a linkje ott lesz a ‘h’ változóban!
12
Reference type (referencia-típus)

Hallgato h;
h.eletkor = 20;
Nem működik, mert a ‘null’ linket nem lehet
követni !

Hallgato h = new Hallgato();


h.eletkor = 20;
Ez működik, mert addigra lesz a memóriában
Hallgató, és a linkje ott lesz a ‘h’ változóban!

13
Reference type (referencia-típus)

Hallgato h= new Hallgato();


h.eletkor = 20;
Hallgato k = h;
Console.WriteLine(k.eletkor); // ???

1 eletkor | nev | ferfi 1

h k

14
Reference type (referencia-típus)

Hallgato k = h;

• Nem készít másolatot a ‘h’-ban tárolt


hallgatóról!
• Mindössze a ‘h’-ban tárolt memóriacímet
másolja bele a ‘k’-ba.
• Így a ‘h.eletkor’ és ‘k.eletkor’ innentől
kezdve ugyanazt jelenti.
• Ez az értékadás gyors, mindössze 4
byte-t kell másolni a memóriában!
15
Reference type (referencia-típus)
Hallgato h = new Hallgato();
h.nev = ”Pistike”;

h = new Hallgato();
h.eletkor = 20;
Console.WriteLine(h.nev); // ????

2 eletkor | nev | ferfi eletkor | nev | ferfi

h 1 2

16
Reference type (referencia-típus)
for(int i=0;i<10;i++)
{
Hallgato h = new Hallgato();
h.nev = Console.ReadLine();
}
Console.WriteLine(h.nev); // ????
Szintaktikai hibás, hiszen a ‘h’ változó a for
blokkján belül lett deklarálva, így a blokkon kívül
nem használható!

17
Reference type (referencia-típus)

Hallgato h;
for(int i=0;i<10;i++)
{
h = new Hallgato();
h.nev = Console.ReadLine();
}
Console.WriteLine(h.nev); // ????

A legutoljára beírt hallgató nevét fogja visszaírni


a képernyőre. A többi hallgató adatai elvesztek
már régen.
18
Reference type (referencia-típus)
Hallgato[] t;
4 byte

null

Hallgato[] t = new Hallgato[40];


40 * 4 byte

1 null | null | null | null | … | null

t 1
19
Reference type (referencia-típus)

Hallgato[] t = new Hallgato[40];


t[0].nev = ”Pistike”; // ????

1 null | null | … | null

t 1

Ez nem működik, mert a t[0] –nál ‘null’ van, és annak


nem lesz .nev mezője sehol a memóriában!

20
Reference type (referencia-típus)

Hallgato[] t = new Hallgato[40];


t[0] = new Hallgato();
t[0].nev = ”Pistike”;

1 2 | null | … | null eletkor | nev | ferfi

t 1 2

Ez működik!

21
Reference type (referencia-típus)
Hallgato t = new Hallgato[40];
Ez még csak a 40 darab memóriacím számára foglal le
helyet (40*4 byte), de a tömbelemek egyelőre ‘null’ értékkel
rendelkeznek, így nem használhatóak fel tényleges
adattárolásra!

for(int i=0;i<t.Length;i++)
{
t[i] = new Hallgato();
}
Ezért kell egy ciklus, amely feltölti a tömbelemeket tényleges
memóriacímekkel!
Ez a művelet meg kell előzze a tömbelemek használatát!
22
Reference type (referencia-típus)
double[] t = new double[30];
30 * 8 byte ( 1 double=8 byte)

1 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | … | 0.0

t 1

A value-type alapú tömbökre ez nem vonatkozik, mivel ott a


tömbelem már rögtön az értéket tárolja.

23
Reference type (referencia-típus)

Hallgato tomb = new Hallgato[40];


foreach(Hallgato h in tomb)
h = new Hallgato();

1 null | null | … | null ???

tomb 1 h

Ez (ha működne) létrehozna a memóriában 40 db Hallgato-t,


amelyeknek a címeit a ‘h’-ba másolná, de minden
ciklusmenet végén el is dobná, mivel a ‘h’-ból ez a
memóriacím nem kerül vissza a tömbbe!
24
Reference type (referencia-típus)
Random rnd = new Random();

A jól ismert Random is ilyen típusú változó


(class alapú).
namespace System
{
class Random
{

}
} 25
Reference type (referencia-típus)
ArrayList l = new ArrayList();

A jól ismert ArrayList is ilyen típusú


változó (class alapú).
namespace System.Collections
{
class ArrayList
{

}
} 26
Reference type (referencia-típus)
ArrayList l = new ArrayList();

Az ArrayList eleve csak memóriacímeket


tárol, de induláskor nulla darabot, úgy
kell őket egyesével hozzáadogatni:

for (int i=0;i<10;i++)


{
Hallgato h = new Hallgato();
h.nev = Console.ReadLine();

l.Add( h );
}
27
Reference type (referencia-típus)
string s = ”Hello Vilag!”

1 H | e | l | l | o | | V | i | l | a | g | ! | \0 1

s 1 m

string m = s;
A másik string változó (‘m’) csak 4 byte-ba kerül, és
ugyanarra a szövegre fog mutatni.

28
Reference type (referencia-típus)

string s = ”Hello Vilag!”;


string m = s;

s = Console.ReadLine();
m = s;
s = s.ToUpper();

s = m.SubString(3,5);
Minden egyes értékadó utasítás a memóriacím-átállításával
jár az új szövegre.
29
Reference type (referencia-típus)
string s = ”Hello Vilag!”

1 Hello Vilag!

s 1

s= s.ToUpper(); // másolatot hoz létre

2 Hello Vilag! HELLO VILAG!

s 1 2

30
Reference type (referencia-típus)
string s = ”Hello Vilag!”
s= s.SubString(3,5); // másolatot hoz létre

2 Hello Vilag! lo Vi

s 1 2

s= s.SubString(3,5).ToUpper();

3 Hello Vilag! lo Vi LO VI

s 1 2 3
31
Reference type (referencia-típus)
string s = ”Hello Vilag!”
s= s + ”Sziasztok!”

2 Hello Vilag! Hello Vilag! Sziasztok!

s 1 2

32
Reference type (referencia-típus)

string s = ”Hello Vilag!”;


string m = ”Sziasztok!”;
s = s+”, ”+m;

3 Hello Vilag! Hello Vilag!, Hello Vilag!, Sziasztok!

s 1 2 3

33

You might also like