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

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

При передаче массива происходит передача только лишь его адреса. Си не делает копии данных, а как бы дает исходному массиву (занимаемой им области памяти) другое имя. В Листинге 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[])

 

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

convert(heat);int heat[];

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


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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: