- •Одномерные и двумерные массивы
- •Размещение массива в памяти
- •456. Объем памяти для массива
- •457. Инициализация массива
- •458. Доступ к элементам массива
- •459. Использование элементов массива в цикле
- •460. Использование констант при объявлении массивов
- •461. Передача массивов как параметров функций
- •462. Массивы как функции
- •463. Отличительная особенность символьных строк как массивов
- •464. Передача массивов в стек при вызове функций
- •465. Максимальный объем памяти, занимаемой массивом
- •466. Использование сверхбольшой модели памяти для больших массивов
- •Двухмерные массивы
- •Массивы строк
462. Массивы как функции
Как известно (С461), при объявлении массива в качестве формального параметра функции не требуется указывать размер массива. Вместо этого необходимо указать только квадратные скобки [ ]. В следующей программе ARRPARAM.C функция show_values вызывается три раза с тремя различными массивами в качестве фактических параметров массива values:
#include <stdio.h>
void show array(int values[], int number of elements)
{
int i;
printf("Вывод на экран %d значений\n", number of elements);
for (i = 0; i < number of elements; i++)
printf("%d\n", values[i]);
}
void main(void)
{
int scores[5] = {70, 80, 90, 100, 90);
int count[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int small[2] = {-33, -44);
show_array(scores, 5);
show array(count, 10);
show array(small, 2);
}
После компиляции и выполнения программы на экран выводятся значения всех трех массивов. Обратим внимание на то, что для функции не имеет значения размер массива. Заметим, однако, что все массивы, передаваемые в функцию, имеют тип int. При попытке передать в функцию массив тпа float компилятор выдаст сообщение об ошибке.
463. Отличительная особенность символьных строк как массивов
Примеры, в которых строки выступают в роли фактических параметров вызываемых функций, встречаются в нашей книге нередко. Как правило, в таких случаях длина строки не указывается как параметр функции. Например, в следующем фрагменте используется функция struprw" преобразования строчных букв в прописные [строка фрагмента не переведена на русский язык, поскольку функция strupr не делает преобразование русских букв. - Прим. перев.}:
char title[64] = "1001 совет по C/C++";
strupr(title);
Как нам уже известно, в языке Си конец символьной строки отмечается NULL-СИМВОЛОМ. Таким образом, в функциях для определения конца строки (рассматриваемого также и как массив) делается поиск элемента, равного нулю. В массивах других типов, например, int, float или long, нет эквивалента для NULL-символа. Поэтому, когда в качестве параметра функции указывается массив элементов, приходится указывать также и другой параметр - длину (количество элементов) массива.
464. Передача массивов в стек при вызове функций
В нескольких ранее приведенных примерах рассматривалось использование массива в качестве параметра функции. При передаче массива как фактического параметра функции Си помещает в стек только адрес первого элемента массива. На рис. 464 показаны, например, массив scores и функция show_array, использующая этот массив. Как можно видеть, в стек помещается только начальный адрес массива.
Рис. 464. При передаче массива как фактического параметра Си передает в стек только адрес первого элемента массива
Как видно из рис. 464, компилятор не передает в функцию никакой информации о длине массива.
465. Максимальный объем памяти, занимаемой массивом
Не существует одной общей границы для максимального объема памяти, занимаемой массивом. При работе в среде DOS максимальный объем памяти, который может быть отведен под массив, зависит от текущей модели памяти. Вообще говоря, массив не может использовать больше 64К памяти. Компиляция следующей программы ТОО_ВIG.С может быть неуспешной из-за того, что массивы требуют достаточно много памяти:
void main(void)
{
char string[66000L]; // 66,000 байт
int values[33000L]; // 33,000 * 2 = 66,000 байт
float numbers[17000]; // 17,000 * 4 = 68,000 байт
}