JavaRush /Курси /C# SELF /Адресація памʼяті та змінні

Адресація памʼяті та змінні

C# SELF
Рівень 2 , Лекція 4
Відкрита

1. Влаштування памʼяті

Кожен компʼютер має оперативну памʼять. Що це таке, які в неї властивості і, найголовніше, яка з цього вам користь?

Кожна програма (зокрема й програми, написані на C#) перед виконанням завантажується до оперативної памʼяті. В оперативній памʼяті містяться код програми (який виконує процесор) і дані програми (які сама програма розміщує в памʼяті).

Що ж таке оперативна памʼять і на що вона схожа?

Уявіть собі Excel. Аркуш в Excel складається з комірок, і в кожної комірки є свій унікальний номер (A1, A2, … B1, B2). Знаючи номер комірки, завжди можна записати до неї якесь значення або отримати значення, що там зберігається. Памʼять компʼютера влаштовано схожим чином.

memory-excel

Програма та її дані під час роботи зберігаються в памʼяті. Уся памʼять компʼютера подана у вигляді маленьких комірок — байтів. Кожна комірка має свій унікальний номер — 0, 1, 2, 3, … (нумерація починається від нуля). Знаючи номер комірки, ми можемо зберегти до неї дані або прочитати їх звідти. В одних комірках зберігається код програми — набір команд для процесора, в інших — дані цієї програми. Номер комірки також називають адресою комірки.

Процесор уміє виконувати команди із завантаженої в памʼять програми. Майже всі команди процесора мають вигляд: взяти дані з деяких комірокзробити з ними щось → результат покласти в інші комірки.

Обʼєднуючи сотні простих команд, ми отримуємо складні й корисні операції.

Коли в коді програми оголошують змінну, їй виділяють ділянку ще не використаної памʼяті. Зазвичай це кілька байтів. Під час оголошення змінної обовʼязково потрібно вказати тип інформації, яку програма зберігатиме в ній: числа, текст чи інші дані. Адже без відомостей про тип незрозуміло, якого розміру блок памʼяті треба виділити під змінну.

На зорі компʼютерної індустрії програми працювали безпосередньо з номерами комірок памʼяті, але згодом для зручності програмістів коміркам почали надавати імена. Унікальне імʼя змінної — передусім для зручності програмістів: під час виконання програма чудово впоралася б і з номерами.

2. Змінні в памʼяті

У C# є чотири основні типи даних для зберігання цілих чисел: byte, short, int і long.

Тип Розмір, байт Походження імені
byte 1 Byte, оскільки займає один байт памʼяті
short 2 Скорочення від Short Integer
int 4 Скорочення від Integer
long 8 Скорочення від Long Integer

Також у C# є два типи для дійсних чисел — float і double:

Тип Розмір, байт Походження імені
float 4 Скорочення від Floating Point Number
double 8 Скорочення від Double Float

Щоразу, коли виконання програми доходить до команди створення змінної, їй виділяють невелику ділянку памʼяті (розмір залежить від типу змінної).

int a = 10;
Оголошення змінної a типу int і виділення памʼяті під неї
Важливо!

Адресою змінної є адреса першої комірки виділеного під неї блоку памʼяті.

C#-програмам заборонено напряму звертатися до памʼяті. Уся робота з памʼяттю відбувається під жорстким контролем C# і .NET.

3. Тип string у памʼяті

Тип string може зберігати великі обсяги даних, тому це не просто тип даних, а повноцінний обʼєкт.

Самі дані типу string (текст) розміщують у спеціальному обʼєкті, під який виділено памʼять, а адресу цього обʼєкта записують у змінну, для якої також виділено памʼять.

  • Змінна a типу int займає 4 байти і зберігає значення 1.
  • Змінна b типу int займає 4 байти і зберігає значення 10 555. Пробіл — це розділення розрядів. Дробову частину в коді відокремлюють крапкою.
  • Змінна d типу double займає 8 байт і зберігає значення 13.001.
  • Змінна str типу string займає 4 байти і зберігає значення D12 — адресу першої комірки обʼєкта, що містить текст.

Обʼєкт типу string (який містить текст) зберігається окремим блоком памʼяті. Адреса його першої комірки зберігається у змінній str.

4. Що відбувається, коли ми присвоюємо

Ще один важливий аспект — як працює операція присвоювання. Наприклад:

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

У цьому прикладі в памʼяті створюються дві комірки: одна для a, одна для b. Коли ми пишемо b = a;, копіюється значення (10), а не сама змінна. Зміни в b жодним чином не впливають на a.

Тепер аналогічно, але з рядками:

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

Тут обидві змінні s1 і s2 посилаються на один і той самий рядок "Hello" до моменту зміни. Але коли ми виконуємо s2 = s2 + " World", для s2 створюється новий рядок "Hello World", а s1 і далі посилається на старий рядок "Hello".

5. Чому в програмуванні майже все нумерують від нуля

Часто виникає запитання, чому в програмуванні майже всюди прийнято рахувати від нуля. Річ у тім, що існує чимало ситуацій, коли рахувати від нуля зручніше (хоча трапляються й випадки, коли зручніше рахувати від 1).

Найпростіший приклад — адресація памʼяті. Якщо вашій змінній виділили 4 байти памʼяті і у вас є X — адреса першого байта, то якими будуть адреси всіх байтів? X+0, X+1, X+2, X+3. І ми вже отримали групу байтів з індексами 0, 1, 2, 3.

Коли ми міркуємо про відносну адресу всередині певного блоку даних, природно отримуємо нумерацію від нуля. Це і є перша й найпоширеніша причина лічби від нуля.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ