Что такое указатели и для чего они нужны более или менее разобрались.Сейчас речь пойдёт об работе оперативной памяти.
Признаться,точно не ясно в какой цикл статей больше подойдёт данная тема,потому как понимание механизма памяти пригождается не только в программировании.И всё же эту тему так же изучают программисты,начнём.
Как выглядят адреса мы уже видели-просто шестнадцатеричные числа (0x11ac1),но где же они располагаются? У оперативной памяти есть "виртуальное управление",которое точно распределяет что где и как должно находиться.Позвольте показать:
Соберите эту программу
void main()
{
char a,b;
printf("0x%x\n0x%x\n",&a,&b);
}
В данной программе мы печатаем адреса двух переменных char,как мы помним данных тип данных занимает один байт.После запуска можно заметить занимательную вещь-в памяти они располагаются рядом.
То есть если адрес переменной a будет заканчиваться на 0x46cdf621,то адрес переменной b будет непременно следующим-0x46cdf622.
Запустите эту программу несколько раз,для наглядности.
Можете так же собрать программу с массивом любого типа данных и в цикле проверить адреса каждого элемента,очень любопытно.
Теперь собственно где всё это располагается.Все статичные переменные,а мы пока работали только с такими располагаются в стеке.
Стек можно сравнить с магазином в пистолете,последнийзаряженный патрон выстреливает первым.Так собственно стек и работает,чем позже был добавлен элемент в него-тем он доступнее.
Следующая информация возможно вас шокирует,но до сих пор мы работали не только со стеком в памяти.Где-то же ещё должен храниться остальной код!
Все наши операторы,функции,вызовы,всё это так же хранится в оперативной памяти на время работы программы.Собственно тут ничего сложного,отдельный сегмент памяти,в котором хранится текст.
В завершение загадаю вам загадку:
void main()
{
char *hello="Hello world!"
printf("%s\n",hello);
}
Почему это работает и почему если вывести адрес-то будет всего лишь один байт,а у нас их тут 13?!Желаю удачи!