Массив как параметр функции c
Массивы и функции
Массивы, также как остальные переменные, можно передавать в функции в качестве аргументов. Рассмотрим такую программу:
На прошлом уроке мы выяснили, что имя массива — это константный указатель на первый элемент массива; т.е. имя массива содержит адрес. Выходит, что мы передаем в функцию копию адреса, а не копию значения. Как мы уже знаем, передача адреса приводит к возможности изменения локальных переменных в вызывающей функции из вызываемой. Ведь на одну и ту же ячейку памяти могут ссылаться множество переменных, и изменение значения в этой ячейке с помощью одной переменной неминуемо отражается на значениях других переменных.
Описание вида arr[] в параметрах функций говорит о том, что в качестве значения мы получаем указатель на массив, а не обычную (скалярную) переменную типа int, char, float и т.п.
В данном случае параметр n — это количество обрабатываемых элементов массива.
Следует еще раз обратить внимание на то, что при передачи имени массива в функцию, последняя может его изменять. Однако такой эффект не всегда является желательным. Конечно, можно просто не менять значения элементов массива внутри функции, как в данном примере, где вычисляется сумма элементов массива; при этом сами элементы никак не изменяются:
Но если вы хотите написать более надежную программу, в которой большинство функций не должны менять значения элементов массивов, то лучше в заголовках этих функций объявлять параметр-указатель как константу, например:
В этом случае, любая попытка изменить значение по адресу, содержащемуся в таком константном указателе, будет приводить к ошибке и программист будет знать, что функция пытается изменить массив.
Усовершенствуем программу, которая была приведена в начале этого урока:
Передача массива в функцию и возврат из функции
Особенность передачи массивов в функции в языке Си в том, что передается не сам массив, а адрес массива, который хранится в локальном указателе на него.
Это можно сделать по-разному, но результат будет одинаковый:
При этом обязательно нужно указать тип элемента массива.
Размер массива в функцию автоматически не передается, поэтому если размер массива заранее (на этапе компиляции) не оговорен, то нужно передать параметр, который содержит количество элементов в массиве, например number_of_elements:
void some_function(int array[], int number_of_elements);
Следующая программа передает массивы в функцию show_array, которая использует цикл for для вывода значений массивов:
show_array.c
void show_array (int array [], int number_of_elements)
<
for ( int i = 0; i printf(«%d\t», array[i]);
>
printf(«\n»);
>
int main()
<
int little_numbers[5] = <1, 2, 3, 4, 5>;
int big_numbers[3] = <1000, 2000, 3000>;
show_array(little_numbers, 5);
show_array(big_numbers, 3);
>
Массив просто передается в функцию по имени (а его имя — это адрес первого элемента), а также указывает параметр, который сообщает функции количество элементов, содержащихся в массиве:
Изменение массива из функции
Возможно ли поменять значения элементов из функции?
Ответ положительный — да, это возможно, причем ничего дополнительно для этого указывать не нужно, так как в функцию передается адрес массива, а не сами значения, то и доступ происходит к тем же самым элементам, а не к их копиям.
Следующая программа использует функцию get_values, чтобы присвоить три значения массиву numbers:
values_from_keyboard.c
#include
void read_array(int array[], int number_of_elements)
<
for(int i = 0; i read_array (numbers, 3); //массив будет изменен!
printf(» Значения массива\n»);
for (int i = 0; i printf(» numbers [%d] \n», i);
>
Как видите, программа передает массив в функцию по имени, а функция присваивает массиву элементы.
Таким образом, функция может изменить элементы массива, если ей это нужно.
Массив как параметр функции c
Использование массива как параметра функции не вызывает ни каких трудностей. Как было сказано ранее, массив в подпрограмму всегда передаётся по адресу, поэтому достаточно при вызове функции указать адрес начала массива или адрес того элемента, начиная с которого предполагается обрабатывать массив.
Возможный вариант решения:
using namespace std;
void print(int x[], int n);
void print(int x[], int n)
Итак, массив в функцию должен передаваться по адресу, и нам необходим в подпрограмме весь массив, поэтому логично вызов функции записать так:
В заголовке функции
void print(int x[], int n) // 1-й вариант
два формальных параметра. Запись x[] говорит о том, что в подпрограмму передаётся именно массив.
Заголовок может выглядеть и так:
void print(int *x, int n) // 2-й вариант
Какую форму использовать? Это дело вкуса. Компилятор рассматривает 1-й вариант как эквивалент 2-го, хотя для человека нагляднее именно 1-й вариант. По нему видно, что формальный параметр — это именно массив, а не указатель, например, на одиночный элемент.
Трактовка при вызове x как &x[0] позволяет при необходимости передать в подпрограмму не весь массив, а только его часть, начиная с какого-либо адреса. Например, вызов
Матрица как параметр функции
Передача в подпрограмму матрицы в качестве параметра несколько сложнее, чем передача одномерного массива.
Матрица также передаётся по адресу. При вызове функции достаточно указать имя матрицы (это будет адресом начала двумерного массива), но как задать описание матрицы в списке формальных параметров? Матрица, как было сказано ранее, — это массив из массивов. Поэтому можно попробовать записать формальный параметр так:
К сожалению, это работать не будет. Первая пара пустых квадратных скобок указывает на то, что имеем дело с массивом. Это допустимо. Вторая пара квадратных скобок как признак того, что это тоже массив, сгенерирует ошибку. Здесь компилятор захочет больше конкретики. Массив из неизвестно каких массивов его не устроит. Во вторых скобках надо записать константу, чтобы компилятор мог понять, как память в матрице распределяется по строкам и столбцам.
Таким образом, допустима запись
Рассмотрим небольшой пример, поясняющий сказанное выше.
Передача массивов в качестве аргументов (руководство по программированию на C#)
Массивы можно передавать в качестве аргументов в параметры метода. Поскольку массивы представляют собой ссылочные типы, метод может изменять значения элементов.
Передача одномерных массивов в качестве аргументов
Инициализированный одномерный массив можно передать в метод. Например, следующий оператор передает массив в метод печати.
В следующем примере кода показана разделяемая реализация метода печати.
Новый массив можно инициализировать и передать за один шаг, как показано в следующем примере.
Пример
В следующем примере массив строк инициализируется и передается в качестве аргумента в метод DisplayArray для строк. Этот метод отображает элементы массива. Затем метод ChangeArray размещает элементы массива в обратном порядке, а метод ChangeArrayElements изменяет первые три элемента массива. После возврата каждого метода метод DisplayArray показывает, что передача массива по значению не препятствует изменению элементов массива.
Передача многомерных массивов в качестве аргументов
Инициализированный многомерный массив можно передать в метод так же, как и одномерный массив.
В следующем коде показано разделяемое объявление метода печати, который принимает в качестве аргумента двухмерный массив.
Новый массив можно инициализировать и передать за один шаг, как показано в следующем примере.
Пример
BestProg
Функции. Часть 2. Функции и массивы. Передача одномерного и многомерного массива в функцию. Передача структуры и класса в функцию
Содержание
Поиск на других ресурсах:
1. Пример определения функции, получающей массив целых чисел
Для передачи массива чисел в функцию, нужно передать указатель на этот массив чисел.
Указателем на массив чисел есть:
Вызов функции SumArrayInts() из другого программного кода.
Следует заметить, что при такой передаче массива в функцию, элементы массива можно изменять в теле функции.
2. Пример передачи строки символов в функцию
Строку символов можно передавать в функцию двумя способами:
Заголовок вышеприведенной функции можно было также определить следующим образом:
Вызов функции GetNPlus2() из другого программного кода.
3. Как передать массив строк в функцию? Пример
Пример. Функция, которая получает массив строк и сортирует его методом вставки. Массив строк передается первым параметром. Вторым параметром передается количество строк.
и возвращает значение
Вызов функции из другого программного кода:
4. Пример передачи двумерного массива как параметра функции
В данном примере описана функция, которая находит сумму элементов двумерного массива. Функция получает двумерный массив вещественных чисел в качестве параметра.
Вызов функции из программного кода. В функцию передается двумерный массив с именем M размером 2×3.
5. Пример передачи в функцию трехмерного массива чисел
Вызов функции из другого программного кода
6. Как передать структуру в функцию? Пример
В качестве параметра структуру можно передавать в функцию двумя способами:
При передаче структуры по значению делается копия в стеке всех полей структурной переменной.
При передаче структуры по адресу передается только адрес структуры в памяти (указатель на структуру). Этот способ есть более эффективным, если для полей структуры нужно выделять много памяти (размер указателя может быть намного меньше размера структурной переменной).
Указатель на структуру, которая передается в функцию может быть двух типов:
Пример. Передача структурной переменной (объекта) по значению и по адресу (случай неуправляемого указателя * ).
Пусть за пределами класса (или в другом модуле) задана структура, которая описывает точку на координатной плоскости:
Пусть заданы 2 функции, которые определяют, равны ли точки между собой:
Тогда вызов функций Equals() и EqualsP() можно осуществить из другого программного кода приблизительно следующим образом:
7. Пример передачи в функцию управляемого указателя на структуру ссылочного типа ( ref )
Структура MyPoint имеет следующее описание:
Определение (реализация) функции EqualsPRef() :
Вызов функции EqualsPRef() из другого программного кода (например, обработчика события клика на кнопке):
8. Как в качестве параметра функции передать объект класса?
Текст модуля MyPointClass.h :
Текст модуля MyPointClass.cpp :
Вызов функции EqualsClass() из другого программного кода (например, из обработчика события):
Чтобы использовать методы класса, нужно предварительно подключить модуль MyPointClass.h :
9. Пример передачи структуры в функцию по ссылке (не поддерживается в среде CLR )
Использование функции EqualsR() в другом программном коде