
- •Глава III. Массивы и указатели
- •9. Массивы
- •9.1. Общие принципы организации массивов
- •9.2. Объявление и инициализация массивов
- •9.3. Заполнение массива данными и вывод элементов массива
- •1. Заполнение массива данными
- •2. Вывод элементов массива
- •9.4. Типовые задачи на обработку одномерных массивов
- •1. Поиск максимального (минимального) значения в массиве и его индекса
- •2. Подсчет суммы значений элементов массива, удовлетворяющих заданному условию
- •3. Подсчет элементов массива, удовлетворяющих заданному условию
- •4. Поиск значений
- •5. Формирование массива по заданному условию
- •6. Перестановка элементов массива в обратном порядке
- •7. Циклический сдвиг элементов массива
- •8. Сортировка элементов массива в порядке возрастания (убывания)
- •9.5. Типовые задачи на обработку двумерных массивов
- •10. Указатели
- •10.1. Назначение указателей
- •10.2. Объявление и инициализация указателей
- •10.3. Операции над указателями
- •10.4. Выражения и арифметические действия с указателями
- •10.5. Связь указателей с массивами
- •10.6. Операторы new и delete. Константа null
- •10.7. Динамические массивы
- •10.8. Массивы указателей
- •Содержание
10.8. Массивы указателей
Как и объекты любых других типов, указатели могут быть собраны в массив. В следующем операторе объявлен массив из 10 указателей на объекты типа int:
int *x[10];
Для присвоения, например, адреса переменной var третьему элементу массива указателей, необходимо написать:
x[2] = &var;
В результате этой операции, следующее выражение принимает то же значение, что и var:
*x[2]
Возможность создания массивов указателей позволяет экономить память при использовании многомерных массивов. Массивы указателей удобны для хранения символьных строк.
По определению массива, его элементы должны быть однотипные и одинаковые по длине. Пусть необходимо определить массив для представления списка фамилий. Если определять его как двумерный массив типа char, то в определении элементов массива необходимо задать предельные размеры каждого из двух индексов, например:
char spisok[25][20];
Таким образом, количество фамилий в списке не более 25 и длина каждой фамилии не превышает 19 символов (букв). При определении массива одну из его предельных размерностей (значение самого левого индекса) можно не указывать. В этом случае количество элементов массива определяется, например, инициализацией (рис. 8):
char spisok[][20] = {"ИВАНОВ", "ПЕТРОВ", "СИДОРОВ"};
Рис. 8. Схема размещения в памяти элементов массива spisok
Теперь в массиве spisok только 3 элемента, каждый из них длиной 20 элементов типа char. В противоположность этому при определении и инициализации этими же символьными строками одномерного массива указателей типа char * память распределяется гораздо рациональнее (рис. 9):
char *pointer[] = {"ИВАНОВ", "ПЕТРОВ", "СИДОРОВ"};
Рис. 9. Схема размещения в памяти элементов с помощью массива указателей
Для указателей массива pointer, в котором 3 элемента и каждый является указателем-переменной типа char *, выделяется всего 3*sizeof(char *) байтов. Кроме того, компилятор размещает в памяти три строковые константы "ИВАНОВ" (7 байт), "ПЕТРОВ" (7 байт), "СИДОРОВ" (8 байт), а их адреса становятся значениями элементов pointer[0], pointer[l], pointer[2] (рис. 9).
Содержание
Глава III. Массивы и указатели 1
9. Массивы 1
9.1. Общие принципы организации массивов 1
9.2. Объявление и инициализация массивов 1
9.3. Заполнение массива данными и вывод элементов массива 3
9.4. Типовые задачи на обработку одномерных массивов 5
9.5. Типовые задачи на обработку двумерных массивов 14
10. Указатели 19
10.1. Назначение указателей 19
10.2. Объявление и инициализация указателей 19
10.3. Операции над указателями 21
10.4. Выражения и арифметические действия с указателями 22
10.5. Связь указателей с массивами 24
10.6. Операторы new и delete. Константа NULL 27
10.7. Динамические массивы 30
10.8. Массивы указателей 33
Содержание 36