Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Задание 2. Процедуры управления динамической памятью программы.






    Указатели.

    Процедуры управления динамической памятью программы.

     

     

    Цели работы:

    – Усвоить понятия «динамическое распределние памяти», «статическое распределение памяти», работа с переменными при статическом и динамическом распределении памяти, «указатели».

    – Получить практические навыки в создании динамических переменных разных типов.

    – Создать простейший проект в системе QT Creator на языке С++, в котором осуществляется работа с переменными в динамической памяти.

     

    Цель создания проекта:

     

    Целью проекта является размещение трех переменных типа int, float, double в динамической памяти и вывод их значений на экран, а также анализ значений указателей на эти переменные до выделения памяти и после и проведения анализа этих исследований.

     

    Задания для самопроверки:

    Задание 1

     

    1. Разместите в динамической памяти две переменные типа float и занесите в одну из них значение корня квадратного от 2.18, а в другую – синус от значения, которое находится в первой переменной.

     

    float * pf1, * pf2; pf1 = new float; pf2 = new float; * pf1 = sqrt(2.18); * pf2 = sin(* pf1);

     

     

    2. Разместите в динамической памяти две переменные типа структура, содержащую информацию о преподавателе: Фамилия, Кафедра, Должность, Зарплата. Одну переменную заполните следующей информацией: Иванов, ИКС, Доцент, 5000.

    Затем скопируйте значение заполненной первой переменной во вторую и только поменяйте значение поля Фамилия на «Петров».

     

     

    typedef struct { string name; string department; string post; int salary; } MyStruct; MyStruct * str1, * str2; str1 = new MyStruct; str2 = new MyStruct; * str1 = { " Гребенник", " ИКС", " Доцент", 5000}; * str2 = * str1;

    str2-> name = " Петров";

     

     

    3. Разместите в динамической памяти переменную типа массив из трех целых чисел и заполните его первый элемент значением 5.

     

    int * ar = new int[3]; * ar = 5;

     

    4. Разместите в динамической памяти массив из 10 структур, содержащих ту же информацию, что и записи в пункте 2 и заполните третий элемент этого массива информацией о вашем преподавателе.

     

    typedef struct { string name; string department; string post; int salary; } MyStruct; MyStruct * strar = new MyStruct[10]; strar[2] = {" Гребенник", " ИКС", " Доцент", 5000};

     

     

    Задание 2

    Напишите программы, которые обеспечат следующее расположение данных в памяти:

    1.

     

    Статическая память  
    P1
    NULL

     

     

    Динамическая память
     
     

     

     

     


    int * P1;

    int * P1 = new int;

    P1 = 78;

    int * P1 = new int;

    * P1 = 56;

    P1 = NULL;

     

    2.

     

    Статическая память  
    P2
    NULL
    P3
    P1

     


     

    Динамическая память
     

     

     

     


    int * P1, * P2, * P3;

    P1 = new int;

    * P1 = 78;

    P2 = NULL;

    P3 = new int;

    3.

     

    Статическая память  
    P2
    P3
    P1

     


     

    Динамическая память
     

     

     


    int * P1, * P2, * P3;

    P1 = new int;

    * P1 = 78;

    P3 = P2 = P1;

     

    4.

     

    Статическая память

     

    P3
    P1

     


     

    Динамическая память
     
    NULL
     

     


     

     

    typedef struct {

    int a;

    void * P;

    } MyStruct;

    MyStruct * P1, * P2;

    P1 = new MyStruct;

    P2 = new MyStruct;

    P1-> a = 78;

    P1-> P = P2;

    P2-> a = 56;

    P2-> P = NULL;

     

    5.

     

    Статическая память

     

    P3
    P1

     


     

    Динамическая память

    NULL
    Зима

     


    ‘Д ’
     

     

    typedef struct {

    int a;

    char * c;

    void * P;

    } MyStruct1;

    typedef struct{

    string s;

    void * P;

    } MyStruct2;

    MyStruct1 * P1;

    MyStruct2 * P3;

    P1 = new MyStruct1;

    P3 = new MyStruct2;

    P1-> c = new char;

    *P1-> c = 'Д';

    P1-> a = 78;

    P1-> P = P3;

    P3-> s = " Зима";

    P3-> P = NULL;

     

    Интерфейс проекта:

    На рисунке 1.1 изображен интерфейс проекта.

     

    Рисунок 1.1 – интерфейс проекта

    Текст программы:

     

    #include < iostream>

     

    using namespace std;

     

    void varInDynamicMemory();

     

    int main()

    {

    varInDynamicMemory();

    return 0;

    }

     

    void varInDynamicMemory() {

    int * p1;

    float * p2;

    double * p3;

     

    int i;

    float f;

    double d;

     

    cout < < " Initial values for putting in dynamic memory: \nint flaot double: ";

    cin > > i > > f > > d;

    cout < < endl;

     

    int iP1 = (int) p1;

    int iP2 = (int) p2;

    int iP3 = (int) p3;

     

    cout < < " Values of pointers before putting in memory: \n";

    cout < < " P1=" < < iP1 < < endl;

    cout < < " P2=" < < iP2 < < endl;

    cout < < " P3=" < < iP3 < < endl;

     

    p1 = new int;

    p2 = new float;

    p3 = new double;

     

    iP1 = (int) p1;

    iP2 = (int) p2;

    iP3 = (int) p3;

     

    * p1 = i;

    * p2 = f;

    * p3 = d;

     

    cout < < " Values of pointers after putting variables in memory: \n";

    cout < < " P1=" < < iP1 < < endl;

    cout < < " P2=" < < iP2 < < endl;

    cout < < " P3=" < < iP3 < < endl;

     

    cout < < " Values of dynamic variables: \n";

     

    i = * p1;

    f = * p2;

    d = * p3;

     

    cout < < " P1=" < < i < < endl;

    cout < < " P2=" < < f < < endl;

    cout < < " P3=" < < d < < endl;

    }

     

    Вывод

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

     

    В таблице 1.1 приведены значения указателей и переменных до и после выделения динамической памяти.

      Указатель Переменная
    До выделения динамической памяти Неопределенное значение Мусор
    После выделения динамической памяти Выделен адреса и размера в памяти, соответсвенно типу указателя Значение переменной

     

    Таблица 1.1 – Значения указателей и переменных до и после выделения динамической памяти

     

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

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

     

     






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.