- •Г.В.Ходова Основы
- •Утверждено редакционно-издательским советом университета
- •Оглавление
- •Вводные сведения о языке программирования
- •Разветвляющиеся и циклические процессы. . . . . . 7
- •Вводные сведения
- •Оператор присваивания.
- •1.3. Инкремент и декремент.
- •1.4. Операторы ввода-вывода.
- •2. Разветвляющиеся и циклические процессы
- •2.1. Условный оператор
- •Оператор ветвления
- •Пример.
- •2.3. Оператор цикла while
- •Задания
- •3. Массивы и строки
- •Задания
- •4. Функции
- •4.2. Рекурсивные функции
- •4.3. Встраиваемые функции
- •Задания
- •5. Структуры
- •Задание
- •6. Указатели
- •Задания
- •7. Динамические структуры данных
- •8. Работа с файлами
- •Литература
- •Подписано в печать 08.06.04. Формат 6084 1/16
- •Ртп рио сзту Тираж 200 Заказ 47
- •191186, Санкт-Петербург, ул. Миллионная, 5
Задание
Написать программу для ввода, редактирования (изменения даты последней продажи) и вывода на экран данных об автомобилях, выставленных на продажу в комиссионном автомагазине, с указанием марки автомобиля, даты выпуска (день, месяц, год), даты последней продажи выпуска (день, месяц, год), стоимости автомобиля. Вычислить общую стоимость всех автомобилей.
Использовать вложенные структуры.
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);
}
