CodeGym /Kurslar /C# SELF /Yaddaş ünvanlanması və dəyişənlər

Yaddaş ünvanlanması və dəyişənlər

C# SELF
Səviyyə , Dərs
Mövcuddur

1. Yaddaşın quruluşu

Hər kompüterdə operativ yaddaş var. Bəs bu nədir, hansı xüsusiyyətləri var və ən əsası, bizə bundan nə xeyir?

Hər bir proqram (o cümlədən C#-da yazılmış proqramlar) işləməyə başlamazdan əvvəl operativ yaddaşa yüklənir. Operativ yaddaşda proqramın kodu (prosessor tərəfindən icra olunur) və proqramın dataları (proqram özü yaddaşa yerləşdirir) olur.

Bəs operativ yaddaş nədir və nəyə bənzəyir?

Təsəvvür elə ki, Excel-də işləyirsən 😎 Excel səhifəsi hüceyrələrdən ibarətdir və hər hüceyrənin unikal nömrəsi var (A1, A2, ... B1, B2). Hüceyrənin nömrəsini bilsən, ora istənilən dəyəri yaza və ya oradan dəyəri götürə bilərsən. Kompüter yaddaşı da buna bənzər şəkildə qurulub.

memory-excel

Proqram və onun dataları işləyərkən yaddaşda saxlanılır. Kompüterin bütün yaddaşı kiçik hüceyrələr – baytlardan ibarətdir. Hər hüceyrənin öz unikal nömrəsi var – 0, 1, 2, 3, ...; (nömrələmə sıfırdan başlayır). Hüceyrənin nömrəsini bilsək, ora data yaza bilərik. Ya da ordan götürə bilərik. Bəzi hüceyrələrdə proqramın kodu – prosessor üçün əmrlər toplusu, digərlərində isə proqramın dataları saxlanılır. Hüceyrənin nömrəsinə həm də hüceyrənin ünvanı deyirlər.

Prosessor yaddaşa yüklənmiş proqramdan əmrləri icra edə bilir. Demək olar ki, bütün prosessor əmrləri belədir: bəzi hüceyrələrdən datanı götüronlarla nəsə et → nəticəni başqa hüceyrələrə yaz.

Yüzlərlə sadə əmri birləşdirəndə, artıq mürəkkəb və faydalı əmrlər alınır.

Proqram kodunda dəyişən elan olunanda, ona hələ istifadə olunmamış yaddaşdan bir hissə ayrılır. Adətən bu, bir neçə bayt olur. Dəyişəni elan edəndə mütləq orada saxlanacaq informasiyanın tipini göstərmək lazımdır: rəqəm, mətn və ya başqa data. Çünki tipini bilmədən, dəyişən üçün nə qədər yaddaş ayırmaq lazım olduğunu müəyyən etmək olmur.

Kompüterlərin ilk dövrlərində proqramlar sadəcə yaddaş hüceyrələrinin nömrələri ilə işləyirdi, amma sonra proqramçılar üçün rahat olsun deyə, hüceyrələrə ad verməyə başladılar. Dəyişənin unikal adı – əsasən proqramçılar üçün rahatlıqdır: proqram işləyərkən nömrələrlə də əla işləyərdi.

2. Dəyişənlər yaddaşda

C#-da tam ədədləri saxlamaq üçün 4 əsas data tipi var. Bunlar byte, short, intlong-dur.

Tip Ölçü, bayt Adın mənşəyi
byte 1 Byte, çünki bir bayt yaddaş tutur
short 2 Short Integer-dən qısaldılıb
int 4 Integer-dən qısaldılıb
long 8 Long Integer-dən qısaldılıb

Həmçinin C#-da 2 real tip var — floatdouble:

Tip Ölçü, bayt Adın mənşəyi
float 4 Floating Point Number-dan qısaldılıb
double 8 Double Float-dan qısaldılıb

Proqram işləyərkən hər dəfə dəyişən yaradanda, ona yaddaşda kiçik bir sahə ayrılır (ölçüsü dəyişənin tipindən asılıdır).

int a = 10;
a dəyişəninin int tipində elan olunması və onun üçün yaddaş ayrılması
Vacibdir!

Dəyişənin ünvanı onun üçün ayrılmış yaddaş blokunun ilk hüceyrəsinin ünvanı sayılır.

C#-proqramlarına birbaşa yaddaşa müraciət etmək qadağandır. Yaddaşla bütün iş C#.NET tərəfindən ciddi nəzarət altında aparılır.

3. Yaddaşda string tipi

string tipi böyük həcmdə data saxlaya bilər, ona görə də bu, sadəcə data tipi deyil, tam bir obyekt sayılır.

string tipinin datası (mətn) xüsusi obyektə yerləşdirilir, onun üçün yaddaş ayrılır, və həmin obyektin ünvanı ayrıca dəyişəndə saxlanılır, onun üçün də yaddaş ayrılır.

  • a dəyişəni int tipindədir, 4 bayt tutur və 1 dəyərini saxlayır.
  • b dəyişəni int tipindədir, 4 bayt tutur və 10,555 dəyərini saxlayır. Vergül burada onluq hissə deyil, sadəcə rəqəmlərin qruplaşdırılmasıdır. Onluq hissə nöqtə ilə ayrılır.
  • d dəyişəni double tipindədir, 8 bayt tutur və 13.001 dəyərini saxlayır.
  • str dəyişəni string tipindədir, 4 bayt tutur və D12 dəyərini saxlayır — mətn saxlayan obyektin ilk hüceyrəsinin ünvanı.

Obyekt string tipində (mətn saxlayan) ayrıca yaddaş blokunda saxlanılır. Onun ilk hüceyrəsinin ünvanı str dəyişənində saxlanılır.

4. Təyinat verəndə nə baş verir

Daha bir vacib məsələ — təyinat necə işləyir. Məsələn:

int a = 10;
int b = a;
b = 20;
Console.WriteLine(a); // 10

Bu nümunədə yaddaşda iki hüceyrə yaradılır: biri a üçün, biri b üçün. b = a; yazanda, dəyər (10) kopyalanır, "qutu" yox. b-də dəyişiklik a-ya təsir etmir.

İndi eyni şeyi sətirlərlə yoxlayaq:

string s1 = "Hello";
string s2 = s1;
s2 = s2 + " World";
Console.WriteLine(s1); // "Hello"
Console.WriteLine(s2); // "Hello World"

Burada hər iki dəyişən s1s2 eyni sətirə "Hello" istinad edir, ta ki dəyişiklik olana qədər. Amma s2 = s2 + " World" yazanda, s2 üçün yeni bir sətir "Hello World" yaradılır, s1 isə hələ də köhnə "Hello"-ya baxır.

5. Niyə proqramlaşdırmada hər şey sıfırdan nömrələnir

Çox adam təəccüblənir ki, proqramlaşdırmada niyə demək olar hər yerdə sıfırdan sayılır. Səbəb odur ki, sıfırdan saymaq daha rahatdır (baxmayaraq ki, bəzən 1-dən saymaq da rahat olur).

Ən sadə nümunə — yaddaş ünvanlanmasıdır. Dəyişən üçün 4 bayt yaddaş ayrılıbsa və səndə X — ilk baytın ünvanı varsa, bütün baytların ünvanları necə olacaq? X+0, X+1, X+2, X+3. Bax, artıq 0, 1, 2, 3 indeksli baytlar qrupu alındı.

Hər hansı data blokunun daxilində nisbi ünvan barədə düşünəndə, həmişə sıfırdan nömrələmə alınır. Bu, sıfırdan saymağın birinci və ən geniş yayılmış səbəbidir.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION