Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Функции в C.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
56.26 Кб
Скачать

Передача аргументо по ссылке (pass-by-reference)

Ссылка на переменную - это другое имя той же переменной. Т.е. это как псевдоним.

Передача по ссылке (pass-by-reference) позволяет изменять значение переменной из внешнего окружения внутри функции.

int simple_function(int&); // прототип ф-ии

int main ()

{

int x = 4; // переменная x в вызывающем окружении

int y;

y = simple_function(x); // присваивание переменной y возвращаемого значения функции

cout << x; // 9

return 0;

}

int simple_function(int& z) // переменная z в функции

{

z = z + 5;

return z;

}

Для передачи по ссылке, после имени типа в обьявлении и определении нужно поставить амперсанд. Больше никаких изменений делать не нужно. Я только изменил имя переменной внутри функции для наглядности.

x и z - одна и та же переменная. При обращении к одной из этих переменных мы обращаемся к одному участку памяти. При передаче аргумента по ссылке не происходит копирования. Просто для участка памяти, где содержится значение, создаётся ещё одно имя - z. Поэтому после вызова функции, у переменной x - новое значение 9.

Через оператор return можно вернуть только одно значение. Передача по ссылке нужна, когда необходимо вернуть несколько значений. Нужно просто передать необходимое количество аргументов и внутри функции произвести над ними необходимые операции. При этом можно вообще ничего не возвращать (использовать тип void). Посмотрите на пример для наглядности:

void simple_function (int&, int&, int&);

int main ()

{

int a = 0;

int b = 2;

int c = 7;

simple_function (a, b, c);

cout << a; // 1

cout << b; // 4

cout << c; // 10

return 0;

}

void simple_function (int& x, int& y, int& z)

{

x = x + 1;

y = y + 2;

z = z + 3;

}

Передача аргументов по указателю (pass-by-pointer)

Обычно в учебниках указатели обьясняют довольно рано и уделяют этой теме немного внимания. Я не буду сейчас объяснять эту тему подробно, потому как она очень сложная и у нас пока нет необходимости использования указателей в программах. Указатели мы рассмотрим после классов и рассмотрим очень подробно т.к. они - одно из ключевых понятий в программировании. В данном уроке заострю внимание только на одном аспекте.

Массивы всегда передаются в функции через указатели:

void simple_function (int a[]); // прототип

int array[5];

simple_function(array); // передача массива в функцию

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

int array[5];

a = array; // указатель

a = array[0]; // не указатель

Перегруженные функции

Очень часто возникает ситуация, когда несколько функций выполняют одинаковые действия, только над разными типами. В данном случае можно использовать перегруженные функции.

Перегруженные функции - это функции с одним именем, но с разными типами аргументов:

int simple_function (float a, float b);

int simple_function (int a, int b);

int simple_function (int a);

Здесь представлено три объявления перегруженной функции simple_function. Для каждого варианта функции, нужно написать своё определение.

Перегруженные функции могут отличаться не только типами аргументов, но и их количевством (сравните 2-е и 3-е объявления).

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

int simple_function (int a);

float simple_function (int a);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]