Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика. Базовый курс. Ч.3. Основы алгоритмизации и про- граммирования в среде Visual C++ 2005.pdf
Скачиваний:
69
Добавлен:
05.02.2023
Размер:
3.81 Mб
Скачать

85

12.3. Указатели и динамические массивы

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

Например,

int n=10;

int *a = new int[n]

Заметим, что обнуление памяти при ее выделении не происходит. Инициализировать динамический массив нельзя. Обратится к элементу динамического массива можно как обычноa[3], так и с использованием указателя *(a+3). Дело в том, что в переменной указателе хранится адрес начала массива. Для получения адреса третьего элемента к этому адресу прибавляется смещение3. Операция сложения с константой для указателей учитывает размер адресуемых элементов, т.е. на самом деле индекс умножается на длину элемента массива:

a + 3*sizeof(int)

Затем с помощью операции* (разадресации) выполняется выборка значения из указанной области памяти.

Если динамический массив в какой-то момент работы программы перестает быть нужным, и мы собираемся впоследствии использовать эту память повторно, необходимо освободить ее с помощью операции delete[], например

delete [] a;

размерность массива при этом не указывается.

Пример 12.3. Рассчитать сумму элементов правее последнего отрицательного.

//сумма элементов правее последнего отрицательного

//элемента (с использованием динамич. массива) #include <iostream>

#include <windows.h> using namespace std; int main()

{int n;

char str[256], str1[256];

AnsiToOem("введи размерность массива ",str);

86

cout<<str; cin>>n; float *a=new float[n]; int i, notr;

AnsiToOem("вводите элементы массива ",str); cout<<str;

AnsiToOem("\n сумма= ",str); AnsiToOem("\n отрицательных нет ",str1); for (i=0; i<n; i++) cin>>a[i];

notr=-1;

for (i=0; i<n; i++) if (a[i]<0) notr=i; if (notr!=-1)

{float sum=0;

for (i=notr+1;i<n;i++)sum=sum+a[i]; cout<<str<<sum;}

else cout<<str1; cout<<"\n";

return(0);

}

12.4. Указатели и перегрузка операций

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

тип operator@ (параметр)

Здесь тип – нужный тип переменной, operator – служебное слово, @ – символическое обозначение нужной операции.

Указатели могут быть использованы и для перегрузки операций. Вспомним, пример 11.1, где мы не смогли использовать операцию инкремента. Достаточно ввести перегрузку для операции‘++’ для перечислимого типа и проблема исчезнет. Такая перегрузка имеет вид:

enum dni{Monday=1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday} ;

dni operator++(dni &m) { return (m=dni(m+1));}

Тогда окончательно текст программы примера 11.1 примет вид:

// перечислимый тип - часы рабочей недели

#include <iostream>