Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
38
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

Программа 29. Выделение и освобождение памяти

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

// Файл AllocMem.cpp

#include <iostream.h>

#include <math.h>

int main()

{

double *pd; // Указатель

// Вывод адреса, хранящегося в pd

cout << hex << "\n Address(pd) = " << pd;

pd = new double; // Выделение памяти

*pd = sqrt(3); // Занесение в память значения

// Вывод адреса и значения

cout << "\n Address(pd) = " << pd << ", Value(*pd) = " << *pd;

char *s; // Символьный указатель

cout << "\n Address(s) = " << (int*)s;

delete pd; // Освобождение памяти

s = new char[80]; // Создание динамического массива

cout << "\n Address(s) = " << (int*)s << ", Value(s) = " << s;

cout << "\n Input a string \n"; // Введите строку

cin.getline(s, 80); // Использование памяти

cout << "Address(s) = " << (int*)s << ", Value(s) = " << s;

cin.get();

return 0;

}

Программа выводит следующее:

Address(pd) = 1

Address(pd) = 8f5fc0, Value(*pd) = 1.73205

Address(s) = 100

Address(s) = 8f5fc0, Value(s) = ∟vg2∟vg2

Input a string

qwerty

Address(s) = 8f5fc0, Value(s) = qwerty

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

Оператор << выводит значение адреса при выводе указателя, за исключением указателей типа char*. При выводе таких указателей печатается не значение указателя (адрес), а строка символов, расположенная по адресу, хранящемуся в указателе, поэтому, чтобы напечатать значения указателя типа char*, производится его приведение к типу int* выражением (int*)s.

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

Массив s создается, после того, как память от pd освобождена. Видно, что под s выделяется то же место в памяти, которое раньше занимало число double, адрес которого хранился в pd.

Задачи 125-134. Указатели и ссылки

Указатель есть адрес некоторого объекта. Если p – указатель на объект, то *p есть сам объект. Адрес объекта возвращает оператор &, который ставится перед именем объекта.

  1. Напишите функцию copy(char *s, char *t) копирования строки t в строку s, используя указатели.

  2. Перепишите функцию revers (программа 23) с использованием указателей.

  3. Используя указатели, напишите функцию strcat(char *s, char *t), копирующую строку t в конец строки s.

  4. Напишите функцию strend(char *s, char *t), которая выдает 1, если строка t расположена в конце строки s, и нуль в противном случае.

  5. Напишите функцию, которая получает в качестве аргумента указатель на функцию double (*f)(double x) и возвращает минимальное значение функции f на отрезке [a, b].

  6. Напишите функцию, которая получает в качестве аргумента указатель на функцию double (*f)(double x) и возвращает среднее значение функции f на отрезке [a, b], вычисленное по n узловым точкам.

  7. Напишите функцию, которая получает в качестве аргумента указатель на функцию double (*f)(double x) и возвращает разницу между максимальным и минимальным значение функции f на отрезке [a, b].

  8. Напишите функцию, которая возвращает ссылку на максимальный из трех своих аргументов. Используя ее, замените значение максимального из трех чисел их средним значением..

  9. Напишите функцию, возвращающую ссылку на максимальный элемент массива. Используйте ее в программе, которая заменит значение максимального элемента массива на среднее арифметическое значение элементов этого массива.

  10. Напишите функции, возвращающие ссылки на максимальный и минимальный элементы массива. Используйте их для обмена значениями максимального и минимального элементов.