Ссылочные переменные
Как мы видели в примере 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 видно, что синтаксис при использовании ссылок более удобен.
Рекурсивные вызовы функций
Любая функция может быть вызвана рекурсивно, т. е. она может вызвать саму себя. Классический пример рекурсии – это вычисление факториала числа 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 // Задание размера матрицы в виде макроса
void input (int mas[] [N], int, int); /* функция ввода матрицы */
int making (int mas[] [N], int, int); /* функция определения максимального элемента */
void main (void)
{
int m, n ;
int a[N][N] ;
int max ;
clrscr() ;
printf (" Введите размер исходной матрицы \n ");
printf (" Число строк = ");
scanf("%d", &m);
printf (" Число столбцов = ");
scanf ("%d", &n);
input(a, m, n); // Выэов функции
max = making(a, m, n);
printf("Значение максимального элемента матрицы равно %d \n", max);
getch();
}
/* Функция осуществляет ввод матрицы
заданного размера */
void input (int a[] [N], int m, int n)
{
int i, j;
for (i = 0;i < m; i++)
for (j = 0; j <n; j++)
{
printf (" Введите A(%d,%d) элемент матрицы : '', i+1, j+1);
scanf ("%d", &a[i] [j]);
}
}
/* Функция вычисляет максимальный элемент матрицы заданного размера */
int making (int a[] [N], int m, int n)
{
int max = a[0] [0] ;
int i, j ;
for (i=0 ; i<m; i++)
for (j=0 ; j<n ; j++)
if (max <a[i] [j] )
max = a[i] [j] ;
return max ;
}
В случае использования одномерного массива заголовки функций будут иметь следующий вид:
void input (int mas[N] , int) ;
int making(int mas[N] , int) ;
а в текст программы следует ввести соответствующие изменения.
Дата добавления: 2017-06-02; просмотров: 968;