Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билет №2.Одномерный массив. Доступ к элементам....doc
Скачиваний:
9
Добавлен:
15.04.2019
Размер:
168.96 Кб
Скачать

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 байт

}