в. mat представляет собой массив, состоящий из трех массивов, каждый из которых содержит 5 целых чисел.
г. psa представляет собой массив, состоящий из 20 указателей на char.
д. pstr представляет собой указатель на массив, состоящий из 20 значений char.
Массивы и указатели 415
8. Решите перечисленные ниже задачи.
а. Объявите массив, состоящий из шести значений типа int, и инициализируйте его значениями 1,2, 4, 8, 16 и 32.
б. Используйте форму запись с массивом для представления третьего элемента (имеющего значение 4) массива, объявленного в пункте а).
в. Предполагая, что действуют правила С99/С11, объявите массив из 100 значений типа int и инициализируйте его таким образом, чтобы последний элемент получил значение -1; значения остальных элементов Moiyr быть произвольными.
г. Предполагая, что действуют правила С99/С11, объявите массив из 100 значений типа int и инициализируйте его так, чтобы элементы 5, 10, 11, 12 и 3 получили значение 101; значения остальных элементов могут быть произвольными.
9. Каков диапазон значений индекса в 10-элементном массиве?
10. Предположим, что имеются следующие объявления:
float rootbeer[10], things[10] [5], *pf, value = 2.2;
int i = 3;
Укажите, какие из приведенных ниже операторов допустимы, а какие — нет:
а. rootbeer [2] = value;
б. scanf ("%f", srootbeer);
в. rootbeer = value;
г. printf ("%f", rootbeer);
Д. things [4] [4] = rootbeer [3];
е. things [5] = rootbeer;
ж. pf = value;
з. pf = rootbeer;
11. Объявите массив размерности 800x600 значений типа int.
12. Имеются три объявления массивов:
double trots[20]; short clops[10][30]; long shots[5][10][15];
а. Напишите прототип и оператор вызова для традиционной функции типа void, которая обрабатывает массив trots, и для функции С, использующей массив переменной длины.
б. Напишите прототип и оператор вызова для традиционной функции типа void, которая обрабатывает массив clops, и для функции, использующей массив переменной длины.
в. Напишите прототип и оператор вызова для традиционной функции типа void, которая обрабатывает массива shots, и для функции, использующей массив переменной длины.
13. Имеются два прототипа функций:
void show(const double ar[], int n); // n - количество элементов
void show2(const double ar2[] [3], int n); // n - количество строк
а. Напишите вызов функции, который передает show() составной литерал, содержащий значения 8, 3, 9 и 2.
б. Напишите вызов функции, который передает show2() составной литерал, содержащий значения 8, 3 и 9 в первой строке и значения 5, 4 и 1 во второй ( троке.
416 глава 10
Упражнения по программированию
1. Модифицируйте программу rain, с из листинга 10.7, чтобы она выполняла вычисления с использованием указателей вместо индексов. (Вам по-прежнему придется объявлять и инициализировать массив.)
2. Напишите программу, которая инициализирует массив значений типа double и затем копирует его содержимое в три других массива. (Все четыре массива должны быть объявлены в главной программе.) Для создания первой копии воспользуйтесь функцией, в которой применяется форма записи с массивами. Для создания второй копии используйте функцию, в которой применяется форма записи с указателями и инкрементирование указателей. Первые две функции должны принимать в качестве аргументов имя целевого массива, имя исходного массива и количество элементов, подлежащих копированию. Третья функция должна принимать в качестве аргументов имя целевого массива, имя исходного массива и указатель на элемент, следующий за последним элементом в исходном массиве. С учетом приведенных ниже объявлений вызовы функций должны выглядеть так:
double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5}; double targetl[5]; double target2[5]; double target3[5];
copy_arr(targetl, source, 5); copy_ptr(target2, source, 5); copy_ptrs(target3, source, source + 5);
3. Напишите функцию, которая возвращает наибольшее значение в массиве значений типа int. Протестируйте эту функцию с помощью простой программы.
4. Напишите функцию, которая возвращает индекс наибольшего значения в массиве значений типа double. Протестируйте эту функцию с помощью простой программы.
5. Напишите функцию, которая возвращает разность между наибольшим и наименьшим элементами в массиве значений типа double. Протестируйте эту функцию с помощью простой программы.
6. Напишите функцию, которая изменяет порядок следования содержимого массива значений типа double на противоположный и протестируйте ее в простой программе.
7. Напишите программу, которая инициализирует двумерный массив значений типа double и использует одну из функций копирования из упражнения 2 для его копирования во второй двумерный массив. (Поскольку двумерный массив - это массив массивов, функция для копирования одномерных массивов может применяться с каждым подмассивом.)
Читать дальше