1. Операция разыменования (разадресации) * предназначена для доступа к величине, адрес которой хранится в указателе:
char ch = 'S';
char * p = &ch;
*p = 'R'; // ch также теперь = 'R'
2. Операция присваивания (слева – имя указателя, справа – указатель, уже имеющий значение, либо адрес объекта, либо NULL), либо адрес в памяти, заданный константой:
char b = 'W';
char * p1 = &b;
char * p2 = (char *)0x12AF40;
Запрещено присваивать значения указателям-константам.
3. Операция приведения типов (см. выше, указатель на void)
Присваивание без явного приведения типов допускается:
а) если тип указателей слева и справа от знака операции присваивания один и тот же;
б) указателям на void.
4. Арифметические операции (применимы только к указателям одного типа)
(++) инкремент перемещает указатель к следующему элементу соответствующего типа (увеличивает значение указателя на sizeof(тип));
(––) декремент перемещает указатель к предыдущему элементу соответствующего типа (уменьшает значение указателя на sizeof(тип));
(+) сложение с константой изменяет значение указателя на величину произведения этой константы и размера объекта данного типа;
|
|
short * p = new short [5]; // Массив
++p; // Увеличение p на 2
p += 3; // Увеличение p ещё на 6
long *q = new long [5];
++q; // Увеличение q на 4
q −= 3; // Уменьшение q на 12
(–) разность двух указателей – разность их значений, делённая на размер типа в байтах;
int * r = new int [10]; // Массив
int * a = &r[6];
int * b = &r[3];
int c;
c = a – b; // c = 3
5. Операции отношения применимы к указателям одинакового типа (сравнение указателей или сравнение с NULL):
if (a == b)...;
char * p = "sss";
if (p)...; // Если p ≠ NULL
Одномерные массивы
Массив – это совокупность переменных, имеющих одинаковый тип и объединённых под одним именем. Элементы одномерного массива расположены в смежной области памяти друг за другом. Объявление одномерного статического массива выглядит следующим образом:
тип имя_массива[размерность];
Как и другие переменные, массив должен быть объявлен явно, чтобы компилятор мог выделить для него память. Здесь тип объявляет базовый тип массива, т.е. тип его элементов, а размерность определяет, сколько элементов содержится в массиве. Размерность статического массива может быть задана только целой положительной константой или константным выражением.
Если при описании статического массива не указана размерность, должен присутствовать инициализатор. В этом случае компилятор выделит память по количеству инициализирующих значений. Размерность массива может быть опущена в списке формальных параметров функции.
// Оъявление массива из 15 вещественных чисел
|
|
double b[15];
// Объявление массива из 5 целых чисел с ини-
int a[] = {1, 2, 3, 4, 5}; // циализацией
Элементы массива нумеруются с нуля. Инициализирующие значения для массивов записываются в фигурных скобках, значения элементам присваиваются по порядку. Если элементов в массиве больше, чем инициализаторов, элементы, для которых значения не указаны, обнуляются:
int c[6] = {4, 3, 2}; // c[3]=c[4]=c[5]=0
Для доступа к элементу массива после его имени указывается номер элемента (индекс) в квадратных скобках.
c[5] = 10; // Присваивается значение 10
b[14] = 5.2;
Размер одномерного массива в байтах вычисляется по формуле:
число_байтов = sizeof(базовый_тип)*число_элементов
В языках С и С++ при обращении к элементам массива автоматический контроль выхода индекса за границу массива не производится, что может привести к ошибкам.
Имя массива является константным указателем на его нулевой элемент.
int * p;
int array[10];
p = array;
В этом фрагменте указателю p присваивается адрес нулевого элемента массива array.
Результатом применения операции & (получения адреса) к имени массива является адрес нулевого элемента массива. Для любого массива будут эквивалентными следующие выражения:
имя_массива == &имя_массива == &имя_массива[0]
К i-му элементу массива можно обратиться с помощью операции индексирования:
имя_массива[i]
а можно и так:
*(имя_массива + i) // Адресная арифметика
Например, b[i] или *(b + i).
Результатом применения операции sizeof к имени статического массива является размер памяти в байтах участка памяти, выделенного не для указателя, а для массива в целом.
Рассмотрим решение задач с массивами.
Задача 1. Создать программу, которая для целочисленного массива из n элементов определяет, сколько положительных элементов располагается между его максимальным и минимальным элементами.
Решение: массив будем просматривать с элемента, следующего за максимальным (минимальным), до элемента, предшествующего минимальному (максимальному).
// Листинг 6.1
#include <iostream>
using namespace std;
int main() {
// Поддержка русского языка
setlocale(LC_ALL, "Russian");
// Именованная константа n - число элементов
const int n = 10; // в массиве
// Определение статического массива
int a[n];
int i, d = 0;
// Индексы максимального и минимального элементов
int imax = 0, imin = 0;
// Количество положительных элементов
int count = 0;
// Ввод с клавиатуры элементов массива
cout << "Введите элементы массива:\n";
for (i = 0; i < n; ++i)
cin >> a[i]; // Индексирование
// Вывод элементов массива на экран
cout << "Введённый массив:\n";
for (i = 0; i < n; ++i)
cout << a[i] << '\t'; // Индексирование
// Определение индексов max и min элементов
for (i = 1; i < n; ++i) {
// Индексирование
if (a[i] > a[imax]) imax = i;
// Адресная арифметика
if (*(a + i) < *(a + imin)) imin = i;
}
if (imax < imin) d = 1;
else if (imax > imin) d = -1;
// Вычисление числа положительных элементов
for (i = imax + d; i!= imin; i += d)
if (*(a + i) > 0) // Адресная арифметика
++ count;
cout << "Количество положительных элементов: "
<< count << endl;
return 0;
}
Задача 2. Для вещественного массива из n элементов (число элементов известно на этапе компиляции) определить сумму его элементов, расположенных правее последнего отрицательного элемента. Элементы массива ввести из файла vector.txt.
Решение: Будем просматривать массив от конца к началу, суммируя его элементы, и завершим цикл, как только встретится отрицательный.
Примечание: файл vector.txt, данными из которого заполняется массив, должен находиться в том же каталоге, где находится файл с текстом программы.cpp.
// Листинг 6.2
#include <iostream>
#include <fstream> // Для работы с файлами
using namespace std;
int main() {
// Поддержка русского языка
|
|
setlocale(LC_ALL, "Russian");
// Именованная конст. n - число элементов массива
const int n = 15;
// Определение статического массива
double mas[n];
int i;
cout << "Ввод элементов из файла vector.txt\n "
// Открытие файла для ввода
ifstream infile("vector.txt");
if (!infile) { // Если не открыт файл
cout << "File can not be open\n";
return 1; // Выход из программы
}
// Заполнение массива из файла vector.txt
for (i = 0; i < n; ++i)
infile >> mas[i];
infile.close(); // Закрытие файла
// Вывод элементов массива на экран
cout << "Введённый массив:\n";
for (i = 0; i < n; ++i)
cout << mas[i] << " "; // Индексирование
cout << endl;
bool flag = false; // Если нет отрицат.элементов
double sum = 0.;
// Вычисление суммы положительных элементов
for (i = n - 1; i >= 0; --i) {
if (mas[i] < 0) { flag = true; break; }
sum += *(mas + i); // Адресная арифметика
}
if (flag) // Проверка флага
cout <<"Сумма положительных элементов "
<< sum << endl;
else cout << "Отрицательных элементов нет\n";
return 0;
}
Задание. Реализовать программу на языке С++, создающую и обрабатывающую одномерный массив согласно варианту. Число элементов в массиве n задать в виде именованной константы. Предусмотреть в программе возможность ввода элементов массива как с клавиатуры, так и из файла (по желанию пользователя программы).
Для перебора элементов массива использовать все три оператора цикла (while, do…while и for).
Вариант 1
Для массива целых элементов вычислить:
- номер максимального элемента массива;
- произведение элементов массива, расположенных между первым и вторым нулевыми элементами.
Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечётных позициях, а во второй половине – элементы, стоявшие в чётных позициях.
Вариант 2
Для массива вещественных элементов вычислить:
- произведение положительных элементов массива;
- сумму элементов массива, расположенных до минимального элемента.
Упорядочить по возрастанию отдельно элементы, стоящие на чётных местах, и элементы, стоящие на нёчетных.
Вариант 3
Для массива вещественных элементов вычислить:
|
|
- количество элементов массива, больших С;
- произведение элементов массива, расположенных после максимального по модулю элемента.
Преобразовать массив таким образом, чтобы сначала располагались все отрицательные элементы, а потом – все положительные (0-вые элементы считать положительными).
Вариант 4
Для массива целых элементов вычислить:
- максимальный элемент массива;
- сумму элементов массива, расположенных до последнего положительного элемента.
Сжать массив, удалив из него все элементы, модуль которых находится в интервале [а,b]. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 5
Для массива вещественных элементов вычислить:
- минимальный элемент массива;
- сумму элементов массива, расположенных между первым и последним положительными элементами.
Преобразовать массив таким образом, чтобы сначала располагались все элементы, равные нулю, а потом – все остальные.
Вариант 6
Для массива вещественных элементов вычислить:
- максимальный по модулю элемент массива;
- сумму элементов массива, расположенных между первым и вторым положительными элементами.
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
Вариант 7
Для массива вещественных элементов вычислить:
- сумму отрицательных элементов массива;
- произведение элементов массива, расположенных между максимальным и минимальным элементами.
Упорядочить элементы массива по возрастанию.
Вариант 8
Для массива вещественных элементов вычислить:
- количество элементов массива, равных 0;
- сумму элементов массива, расположенных после минимального элемента.
Упорядочить элементы массива по возрастанию модулей элементов.
Вариант 9
Для массива вещественных элементов вычислить:
- количество элементов массива, лежащих в диапазоне от А до В;
- сумму элементов массива, расположенных после максимального элемента.
Упорядочить элементы массива по убыванию модулей элементов.
Вариант 10
Для массива вещественных элементов вычислить:
- сумму элементов массива с нечетными номерами;
- сумму элементов массива, расположенных между первым и последним отрицательными элементами.
Сжать массив, удалив из него все элементы, модуль которых не превышает 1. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 11
Для массива вещественных элементов вычислить:
- количество отрицательных элементов массива;
- сумму модулей элементов массива, расположенных после минимального по модулю элемента.
Заменить все отрицательные элементы массива их квадратами и упорядочить элементы массива по возрастанию.
Вариант 12
Для массива вещественных элементов вычислить:
- номер минимального по модулю элемента массива;
- сумму модулей элементов массива, расположенных после первого отрицательного элемента.
Сжать массив, удалив из него все элементы, величина которых находится в интервале [а,b]. Освободившиеся в конце массива элементы заполнить нулями.
Вариант 13
Для массива вещественных элементов вычислить:
- номер максимального по модулю элемента массива;
- сумму элементов массива, расположенных после первого положительного элемента.
Преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [а,b], а потом – все остальные.
Вариант 14
Для массива вещественных элементов вычислить:
- произведение отрицательных элементов массива;
- сумму положительных элементов массива, расположенных до максимального элемента.
Изменить порядок элементов в массиве на обратный.
Вариант 15
Для массива вещественных элементов вычислить:
- сумму положительных элементов массива;
- произведение элементов массива, расположенных между максимальным по модулю и минимальным по модулю элементами.
Упорядочить элементы массива по убыванию.
Вариант 16
Для массива целых элементов вычислить:
- минимальный по модулю элемент массива;
- сумму модулей элементов массива, расположенных после первого элемента, равного нулю.
Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в чётных позициях, а во второй половине – элементы, стоявшие в нечётных позициях.
Вариант 17
Для массива целых элементов вычислить:
- количество положительных элементов массива;
- сумму элементов массива, расположенных после последнего элемента, равного нулю.
Преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых не превышает 1, а потом – все остальные.
Вариант 18
Для массива целых элементов вычислить:
- произведение элементов массива с чётными номерами;
- сумму элементов массива, расположенных между первым и последним нулевыми элементами.
Преобразовать массив так, чтобы сначала располагались все положительные элементы, а потом – все отрицательные (элементы, равные 0, считать положительными).
Вариант 19
Для массива вещественных элементов вычислить:
- сумму элементов массива, расположенных между первым и вторым отрицательными элементами;
- номер минимального элемента массива.
Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1, а потом – все остальные.
Вариант 20
Для массива вещественных элементов вычислить:
- количество элементов массива, меньших С;
- сумму целых частей элементов массива, расположенных после последнего отрицательного элемента.
Преобразовать массив таким образом, чтобы сначала располагались все элементы, отличающиеся от максимального не более чем на 20%, а потом – все остальные.