Вы когда-нибудь задумывались, почему и как работают выделение памяти и указатели? Будучи новичком в программировании, я считал эту концепцию немного сложной, чего на самом деле сейчас нет! Итак, в этой статье мы рассмотрим ключевую концепцию, лежащую в основе любого языка программирования: использование памяти! :)

Он также основан на базовой концепции указателей вместе с управлением памятью. Итак, читайте, чтобы узнать… желаю удачного чтения !!

Что такое выделение памяти?

Выделение памяти - это процесс выделения участков памяти в программе, которые будут использоваться для хранения переменных и экземпляров структур и классов.

Давайте разберемся с этим на примере с точки зрения непрофессионала!

Это похоже на то, как кого-то по имени ‘AASTHA’ выделяют в гостиничный номер из множества свободных или пустых ранее существовавших номеров. Этот пример, вероятно, очень ясно показал, как компьютер распределяет память или создает переменную.

Зачем нам нужно выделение памяти?

Существенным требованием управления памятью является обеспечение способов динамического выделения частей памяти программам по их запросу и освобождения их для повторного использования, когда они больше не нужны.

Распределение памяти одинаково для всех языков или отличается для некоторых?

Когда дело доходит до C, память выделяется с помощью функций malloc (), calloc () и realloc () и освобождается с помощью free ().

Однако в объектно-ориентированных языках программирования, таких как C ++, C # и Java, память динамически выделяется с помощью new и освобождается с помощью ключевых слов (операторов) delete в случае C ++.

Сколько существует типов распределения памяти?

По сути, существует три типа распределения памяти. Это:

· Выделение статической памяти или времени компиляции.

· Распределение оперативной или динамической памяти.

· Автоматическое выделение памяти.

1. Распределение статической памяти: когда объем памяти должен быть выделен заранее, то есть во время компиляции, это называется распределением статической памяти. Это означает, что память для ваших переменных выделяется при запуске программы. После того, как память выделена статически, ее нельзя освободить во время выполнения программы. Таким образом, это приводит к нерациональной трате места для хранения.

Он применяется к глобальным переменным, переменным области видимости файла и переменным, квалифицируемым как static внутри функций. Распределение статической памяти выполняется в стеке. Адрес переменной можно найти с помощью оператора адрес и присвоить ему указатель.

2. Динамическое распределение памяти: Когда распределение памяти выполняется во время выполнения (время выполнения), это называется динамическим распределением памяти. . При динамическом распределении памяти пространство выделяется с помощью функций calloc () и malloc (). Когда значение возвращается функциями, оно присваивается переменным-указателям. Вы также можете контролировать точный размер этих ячеек памяти. Кроме того, если вы не освободите память, вы столкнетесь с утечками памяти, что может привести к сбою вашего приложения, поскольку в какой-то момент система не может выделить больше объем памяти. Распределение динамической памяти может выполняться как в стеке, так и в куче.

3. Автоматическое распределение памяти: Это происходит для (нестатических) переменных, определенных внутри функций, и обычно сохраняется в стеке. Вам не нужно резервировать дополнительную память с их помощью, но, с другой стороны, вы также имеете ограниченный контроль над временем жизни этой памяти. Автоматические переменные в функции существуют только до завершения функции.

Понятия указателей и выделения памяти взаимосвязаны. Когда вы выделяете память для собственных данных во время выполнения программы, это называется динамическим распределением памяти во время выполнения с использованием указателей.

Итак, давайте посмотрим, как они связаны, поняв концепцию указателя!

Что за указатель?

Указатель - это переменная, которая хранит адрес памяти или содержит адрес другой переменной (int, char, array, function или любой другой указатель), где адреса - это номер ячейки, который всегда содержит целое число.

Почему это называется указателем?

Он называется указателем, потому что он указывает на конкретное место в памяти, сохраняя адрес этого места. Указатели - это символические представления адресов.

Синтаксис указателя:

тип данных * имя переменной;

(здесь * перед указателем указывает компилятор, переменная объявлена ​​как указатель.)

Пример:

int * ptr; // ptr может указывать на адрес, содержащий данные типа int

Когда указатель объявлен, он содержит значение мусора, т.е. он может указывать на любое значение в памяти.

В указателе используются два оператора. Это:

1. Оператор адреса (&) - выдает значение, хранящееся по определенному адресу.

2. Оператор перенаправления / отмены ссылки (*) - его нельзя использовать ни в какой константе или в каком-либо выражении.

Давайте посмотрим на разные типы указателей:

1. нулевой указатель

2. свисающий указатель

3. общий указатель

4. дикий указатель

5.Сложный указатель

6. рядом с указателем

7. Дальний указатель

8. огромный указатель

Подводя итог концепции, указатели позволяют вам обращаться к одному и тому же пространству в памяти из разных мест. Это означает, что вы можете обновлять память в одном месте, а изменение можно увидеть из другого места в вашей программе. Также вы можете использовать указатели в любом месте, где вам нужно получить и передать адрес в определенное место в памяти.

Итак, как это было… сложно… запутанно… легко? Дайте мне знать в разделе комментариев: D