Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования на C.doc
Скачиваний:
4
Добавлен:
01.04.2025
Размер:
197 Кб
Скачать
☆

Задание

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

Использовать вложенные структуры.

6. Указатели

6.1. РАСПРЕДЕЛЕНИЕ ПАМЯТИ

В С++ имеются два способа распределения памяти под переменные: статический и динамический [4],[5]. При статическом распределении всем объявленным переменным выделяются фиксированные участки памяти, которые закрепляются за переменными на все время работы программы. Такие переменные называются статическими.

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

Каждая ячейка памяти имеет адрес (номер).

Указатель – это обычная статическая переменная, в которой хранится адрес динамической переменной (говорят, что указатель адресует динамическую переменную). При объявлении перед идентификатором указателя ставится символ *, например:

int *p; // Объявляется переменная р как указатель на целое

В отличие от статических переменных при объявлении указателя память для соответствующей динамической переменной сразу не выделяется. Для выделения памяти под динамическую переменную используется оператор new:

new(<тип динамической переменной>|<размер блока памяти>);

Оператор new возвращает адрес начала блока выделенной памяти. Например,

p = new(int);

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

Для получения доступа к значению, адресуемому указателем, используется разыменование указателя, при этом перед идентификатором указателя ставится символ *. Например:

*р = 5;

в область памяти, адресуемую указателем р, записывается целое число 5.

Следует отличать указатель и значение, которое он адресует. Например:

cout<<p;

выводит на экран дисплея значение указателя р, то есть адрес ячейки памяти;

сout<<*p;

выводит на экран содержимое ячейки памяти с адресом р, то есть целое число 5.

Для освобождения занятой памяти от динамических переменных используется оператор delete:

delete(<указатель на динамическую переменную>);

Например :

delete (p);

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

delete(p1,p2,p3);

6.2. УКАЗАТЕЛИ И СТРУКТУРЫ

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

Рассмотрим структуру coordinate:

struct coordinate

{ int x;

int y;

};

coordinate *p; // р – указатель на структуру типа coordinate

Для доступа к членам структуры через указатель используется символ ->, например,

p->x = 123;

p->y = 321;

Пример.

Программа позволяет ввести в память компьютера и затем вывести на экран дисплея данные о сотрудниках фирмы (фамилию, год рождения).

#include <iostream.h>

#define MAX 25

struct sotr

{char lastName[20];

int year;

};

main()

{

// Объявление массива указателей

// на структуру типа sotr

sotr *ps[MAX];

for (int i=0; i<MAX; i++)

{ // Выделение места в памяти под сотрудника

ps[i] = new(sotr);

// Ввод данных сотрудника

cout<<”Enter the last name:”;

cin>>ps[i]->lastName;

cout<<”Enter the year:”;

cin>>ps[i]->year;

}

// Вывод данных о сотрудниках на экран

for i=0; i<MAX; i++)

{ cout<< ps[i]->lastName<<” “

<< ps[i]->year<<”\n“;

// Освобождение памяти, выделенной под сотрудника

delete(ps[i]);

}

return(0);

}