JavaRush /Курси /Java Syntax Zero /Адресація пам'яті та змінні

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

Java Syntax Zero
Рівень 2 , Лекція 7
Відкрита

1. Будова пам'яті

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

Кожна програма (включно з програмами, написаними мовою Java) перед виконанням завантажується в оперативну пам'ять. В оперативній пам'яті містяться код програми (який виконується процесором) і дані програми (які в пам'ять поміщає сама програма).

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

Уявіть собі Excel 😎 Сторінка в Exсel складається з клітинок (комірок), і кожна комірка має свій унікальний номер (A1, A2, ... B1, B2). Якщо знати номер комірки, завжди можна записати в неї якесь значення або ж отримати значення, що там зберігається. Пам'ять комп'ютера побудована за схожим принципом.

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

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

Поєднуючи сотні простих команд, ми отримуємо складні та корисні команди.

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

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


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

Загалом у Java є 4 типи даних для зберігання цілих чисел. Це byte, short, int і long.

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

Також у Java є 2 дійсні типи — float і double:

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

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

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

Java-програмам заборонено звертатися безпосередньо до пам'яті. Уся робота з пам'яттю відбувається лише через Java-машину.


3. Тип String у пам'яті

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

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

Змінна a типу int займає 4 байти і зберігає значення 1.

Змінна b типу int займає 4 байти і зберігає значення 10,555. Кома тут не відокремлює дробову частину числа, а розділяє групи розрядів. Дробову частину відокремлюють крапкою.

Змінна d типу double займає 8 байтів та зберігає значення 13.001.

Змінна str типу String займає 4 байти і зберігає значення G13 — адресу першої комірки об'єкта, який містить текст.

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


4. Чому в програмуванні все нумерують починаючи з нуля

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

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

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

Коментарі (15)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Гаркін Рівень 14
22 грудня 2025
Граматична помилка "Кому тут" - "Кома тут"
Тимур Рівень 3
3 березня 2024
В целом понятно, но, последний, 4-й параграф нужно переделать - он ен вносит ясности, совсем. Комментарии больше помогли понять, но, скорее даже надо гуглить дополнительно.
Roma Chernesh Рівень 16
19 жовтня 2022
Щось взагалі не зрозумів приклад у кінці "чому зручніше рахувати з нуля". Так-то стаття цікава, але саме цей момент якись дивакуватий.
DmytroStepanenko Рівень 51
15 березня 2023
А що не зрозуміло? Зручніше з 0, тому що якщо до Х+0, то отримуємо відлік з 0 і це зручно, а якщо з Х+1, то не зручно, якщо ви не зрозуміли де зручність - перечитайте ще раз. Якщо прочитав 5 разів і не стало зрозуміло, то прийми як факт і забий, ось і все програмування в цілому)
Олексій Рівень 7 Expert
22 квітня 2023
Потому, что в арифметике при 1-1=0 или 5-5=0 мы получаем пустоту, ноль, а в оперативной памяти ячейка 00000000 - ноль, первый байт физически присутствует, то есть ее можно пощупать. 00000001 – второй байт и так далее. Вот по этой причине отсчет начинается с ноля (первый байт — это значение ноль 0). В противном случае необходимо было бы компьютеру каждый раз давать команду, что бы он пропускал значения первого байта и начинал отсчет со второго байта, то б то с единицы.
Roma Chernesh Рівень 16
10 травня 2023
Снобізм тих, хто зрозумів велику істинку "навіщо програмісти рахують не як усі люди, а з 0")) Це прям щось із чимось))
Anonymous #3312433 Рівень 5
11 червня 2023
Дякую, хороше пояснення.
28 серпня 2023
🤣🤣🤣👍
Ivan D. Рівень 3
15 червня 2025
Не звертайте увагу на коментарі "гостророзумних"... Тут справа в тому, що будь-який самостійний фрагмент коду повинен мати змогу працювати та бути застосованим в будь-якому місці, де може знадобитися його функціонал. Це місце та умови роботи ви заздалегідь не знаєте, тож маєте підготувати свій код до праці з будь-якого місця. У вас є код, в якому адреси позначені [0, 1, 2, 3]... Віртуальна машин розташує цей код на місце в пам'яті, де працюватиме він з місця Х - додасть автоматично ваші [0, 1, 2, 3] = отримає [Х, Х+1, Х+2, Х+3]; теж саме, коли ваш код працюватиме з місця "У" в пам'яті. не кажучи вже про місце й... Де тільки може працюввти віртуальна джава машина.
dianosauric Рівень 42
30 серпня 2022
а ще можна відразу сюди додати boolean і char, щоб тут познайомитись з усіма простими типами даних. Бо вони згадуються в наступній лекції без пояснення і не вистачає контексту
dianosauric Рівень 42
30 серпня 2022
Вітаю! Підтримую, що було б доречно до типів даних додати діапазони допустимих значень. + задачі для закріплення використання різних простих типів ;)
Pan Vitali Moroz Рівень 51
31 серпня 2022
Вітаю, мені власне хочеться зрозуміти/запамятати чому в інт 4 байти і як формується число і кількість нулів. Загалом це якась вступна частина до чогось більшого
9 лютого 2022
Добрий вечір! Було б доречно долучити до таблиці з типами даних, що тип byte зберігає цілі числа в діапазоні від -128 до 127, тип short зберігає цілі числа в діапазоні від -32,768 до 32,767, тип int зберігає цілі числа в діапазоні від -2,147,483,648 до 2,147,483,647, тип int зберігає цілі числа в діапазоні від -9,223,372,036,854,775,808 дo 9,223,372,036,854,775,807.
IvanPozdniakov Рівень 13
27 липня 2022
Поправочка ) останній тип має бути long зберігає цілі числа в діапазоні від -9,223,372,036,854,775,808 дo 9,223,372,036,854,775,807. 😏
28 серпня 2023
Я впевнений, що Андрій просто допустив опечатку)))