Как мы видели в примере 5.3, при передаче в функцию указателей в теле функции необходимо использовать явно операцию разадресации (* адрес объекта). Это усложняет синтаксис. Чтобы исключить этот недостаток в языке Си были введены ссылки. Ccылка – это другое имя переменной (объекта). Синтаксис объявления ссылочной переменной имеет следующий вид:
Тип &имя ссылки=имя объекта;
Например:
int x = 20;
float y;
int &n = x;
float &m =y;
После таких объявлений ссылочные переменные n и m будут определять местоположение в памяти переменных x и y, т.е., если ссылке присваивается значение, то и переменная получит тоже значение.
Из примеров видно, что при объявлении ссылочной переменной она обязательно должна быть проинициализирована, так как в противном случае неясно на какой объект будет производиться ссылка.. При обращении к ссылочным переменным нет необходимости в операции снятия ссылки, т. е. переменные n и m будут обрабатываться как “нормальные” переменные типов int и float.
Запишем теперь программу, изменяющую значения переменных с использованием ссылочных переменных:
Пример: 5.4
# include<stdio.h>
void obmen(int &, int &);
void main (void)
{
int x = 5, y = 20;
printf(“x = %d y = %d \n”, x, y);
obmen(x, y);
printf(“x = %d y= %d \n”, x, y);
void obmen(int &a, int &b);
{
int temp;
temp = a;
a = b;
b = temp;
}
Из примера 5.4 видно, что синтаксис при использовании ссылок более удобен.
5. 5. Рекурсивные вызовы функций
Любая функция может быть вызвана рекурсивно, т. е. она может вызвать саму себя. Классический пример рекурсии – это вычисление факториала числа n! =1*2*3…*n. Пример рекурсивной функции, вычисляющей значение факториала для n> 0:
fact (int n) // Название функции
{
int a;
if (n= = 1) return 1;
a = fact (n – 1)*n;
return a;
}
Массивы могут использоваться в качестве формальных аргументов функции. В случае одномерных массивов указывается тип, имя и размер массива - параметра. При использовании в качестве формального параметра двумерного массива следует указать его размер по второму индексу, например,
int func(int mas[] [N], int n, int m);
При таком описании функции компилятору сообщается на сколько строк следует разбить передаваемый массив - параметр.
Вызов такой функции должен иметь следующий вид:
var = func(mas, n, m);
т.е. фактическим аргументом при вызове функции является указатель на первый элемент массива.
Приведем пример программы, в которой используется передача в функцию двумерного массива.
Пример:5.5 /* Программа работы с матрицей */
#include<stdio.h>
#include<conio.h>
#define N 5 // Задание размера матрицы в виде макроса