Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Передача массива функции

Массив может быть передан целиком из одной функции в другую, хотя в языках Си и Си++ процедура передачи массива довольно сильно отличается от передачи переменных других типов. При передаче переменной, не являющейся массивом, Си копирует данные, помещая их в область памяти, отведенную для принимающей переменной. Таким образом, имеются два набора данных, и если вызванная функция изменит значение переданной ей переменной, содержимое исходной переменной затронуто не будет.

При передаче массива происходит передача только лишь его адреса. Си не делает копии данных, а как бы дает исходному массиву (занимаемой им области памяти) другое имя. В Листинге10.3 продемонстрировано, как передавать массив в качестве аргумента. Обратите внимание, что для вызова аргумента используется только имя массива без индекса:

convert(temps)

Листинг 10.3. Передача массива.

/*arr_pass.c*/

#define COUNT 31

main()

{

int temps[COUNT];

int index;

float celsius;

/*загрузка значений в массив*/

for (index = 0; index < COUNT; index++)

{

printf("Введите значение температуры #%d: ", index);

scanf("%d", &temp[index]);

}

/*передача массива функции convert()*/

convert(temps);

}

/*функция преобразования значений*/

convert(heat)

int heat[];

{

int index;

float celsius;

for (index = 0; index < COUNT; index++)

{

celsius = (5.0 / 9.0) * (temps[index] - 32);

printf("%d\t\t%6.2f\n", heat[index], celsius);

}

}

Передача массивов в Си стандарта K&R

Так отмечается дополнительная информация, в основном касающаяся особенностей языка Си++, которую при первом чтении можно пропустить.Исходный K&R-стандарт Си не позволяет передавать массив, используя только его имя, как это сделано в примере. В этом случае для передачи массива необходимо использовать указатель на переменную, с которым вы познакомитесь в главе 11. Однако компиляторы ANSI-Си и Си++ позволяют передавать массив с использованием синтаксиса, показанного в этой главе.

Замечания по Си++

Запомните, что Си++ позволяет определять массив непосредственно в аргументе, например, следующим образом:

convert(heat[])

Так как в действительности был передан адрес массива, нам нет необходимости указывать количество элементов в формальном аргументе. Поэтому в записи используются только пустые квадратные скобки, указывающие на то, что имеется в виду именно массив:

convert(heat);

int heat[];

Передача параметра посредством передачи адреса вместо копирования данных экономит память, но этот способ может давать побочные эффекты. Изменение

Рис. 10.6. Изменение значения массива функцией

массива в вызываемой функции приводит к изменению значений переданного ей массива, то есть если функция convert() присвоит новые значения массиву heat, эти же значения будут присвоены и массиву temps. Рис.10.6 демонстрирует программу, в которой функция convert() добавляет к значению каждого элемента массива heat единицу. Массив heat имеет тот же адрес в памяти, что и массив temps, поэтому значение каждого элемента массива temps также увеличится на единицу.