Массив может быть передан целиком из одной функции в другую, хотя в языках Си и Си++ процедура передачи массива довольно сильно отличается от передачи переменных других типов. При передаче переменной, не являющейся массивом, Си копирует данные, помещая их в область памяти, отведенную для принимающей переменной. Таким образом, имеются два набора данных, и если вызванная функция изменит значение переданной ей переменной, содержимое исходной переменной затронуто не будет.
При передаче массива происходит передача только лишь его адреса. Си не делает копии данных, а как бы дает исходному массиву (занимаемой им области памяти) другое имя. В Листинге 3 продемонстрировано, как передавать массив в качестве аргумента. Обратите внимание, что для вызова аргумента используется только имя массива без индекса:
convert(temps)Листинг 3. Передача массива.
/*arr_pass.c*/#define COUNT 31main() { 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); } }
|
|
|
Так как в действительности был передан адрес массива, нам нет необходимости указывать количество элементов в формальном аргументе. Поэтому в записи используются только пустые квадратные скобки, указывающие на то, что имеется в виду именно массив:
convert(heat);int heat[];Передача параметра посредством передачи адреса вместо копирования данных экономит память, но этот способ может давать побочные эффекты. Изменение
Рис. 6. Изменение значения массива функцией
массива в вызываемой функции приводит к изменению значений переданного ей массива, то есть если функция convert() присвоит новые значения массиву heat, эти же значения будут присвоены и массиву temps. Рис. 6 демонстрирует программу, в которой функция convert() добавляет к значению каждого элемента массива heat единицу. Массив heat имеет тот же адрес в памяти, что и массив temps, поэтому значение каждого элемента массива temps также увеличится на единицу.