Операции над указателями

 

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%, а потом – все остальные.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: