Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка-ТП-С++.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
661.5 Кб
Скачать

5.2.4. Массивы и функции

Что произойдет, если вы захотите передать массив в функцию? Рассмотрим следующую функцию, возвращаемую индекс минимального числа массива int:

int imin(int list[], int size)

{

int i, minindx, min;

minindx = 0;

min = list[minindx];

for (i = 1; i < size; i++)

if (list[i] < min)

{

min = list[i];

minindx = i;

}

return(minindx);

}

Здесь вы видите одну из важных особенностей С++: вам необязательно знать при трансляции величину list[]. Почему? Потому что компилятор считает list[] начальным адресом массива, и не заботится о том, где его конец.

Программа, обращающаяся к функции imin, может выглядеть так:

void main()

{

#define VSIFE 22

int i, vector[VSISE];

for (i = 0; i < VSIZE; i++)

{

vector[i] = rand();

printf("vector[%2d] = %6d\n", i, vector[i]);

}

i = imin(vector, VSIZE);

printf("minimum: vector[%2d] = %6d\n",

i, vector[i]);

}

Может возникнуть вопрос: что именно передается в imin? В функцию imin передается начальный адрес массива vector. Это означает, что если вы производите какие-либо изменения массива list в imin то, те же изменения будут произведены и в массиве vector. Например, вы можете написать следующую функцию:

void setrand(int list[], int size);

{

int i;

for(i=0; i < size; i++) list[i] = rand();

}

Теперь для инициализации массива vector вы можете написать в main setrand(vector, VSIZE). Следует заметить, что массиву vector будут присвоены некие случайные числа, являющиеся результатом работы датчика случайных чисел, эмулируемого функцией Си rand().

А как передавать многомерный массив? Имеется ли такая возможность? Предположим, вы хотите модифицировать setrand для работы с двумерным массивом. Вы должны написать приблизительно следующее:

void setrand(int matrix[ ][CSIZE],int rsize)

{

int i,j;

for (i = 0; i < rsize; i++)

{

for (j=0, j < CSIZE; I++)

matrix[i][j] = rand();

}

}

где CSIZE – это глобальная константа, определяющая второе измерение массива.

Другими словами, любой массив, передаваемый setrand, получит второе измерение массива, равное CSIZE.

Однако, есть еще одно решение. Предположим, у вас есть массив matrix[15,7], который вы хотите передать в setrand. Если вы используете следующее описание:

setrand (int list[], int size);

Обращение к функции будет иметь вид:

setrand(matrix, 15*7);

Массив matrix будет рассматриваться функцией setrand как одномерный массив, содержащий 105 элементов (15 строк * 7 столбцов), с которым будут произведены необходимые вам действия.

5.2.5. Индексы массивов

Не забудьте, что индекс массива начинается с элемента [0], а не с элемента [1]. Наиболее распространенная ошибка может быть проиллюстрирована на примере следующей программы:

void main()

{

int list[100], i;

for (i =1; i <= 100; i++);

list[i] = i + 1;

}

Данная программа оставляет первый элемент list – list[0] – неинициализированным, и записывает значение в несуществующий элемент list – list[100], возможно испортив при этом другие данные.

Правильная программа будет иметь следующий вид:

void main()

{

int list[100], i;

for (i = 0; i < 100; i++)

list[i] = i + 1;

}