- •Лабораторная работа № 7 Программирование с использованием функций
- •Теоретические сведения
- •Стандартные функции
- •Определение функции
- •Программируемые функции
- •Параметры функций
- •Возвращение значений с помощью оператора return
- •Параметры функций
- •Пример 6.
- •Передача массивов в качестве аргументов функции
- •Понятие об указателях
- •Пример 9 [2]. Использование указателей для нахождения среднего значения массива n целых чисел.
- •Понятие ссылки
- •Контрольные вопросы
- •Лабораторное задание
- •Порядок выполнения лабораторной работы
- •Требования к отчету
- •Варианты заданий
Понятие ссылки
В С++ имеется несколько видоизмененная форма указателя, называемая ссылкой. Ссылка на некоторую переменную может рассматриваться как указатель, который при употреблении всегда разыменовывается. Однако для ссылки не требуется дополнительного пространства памяти: она является просто другим именем (псевдонимом) переменной.
Для определения ссылки применяется унарный оператор &.
Пример 10[2].
# include <stdio.h>;
int value=10;
int &refval=value; // Ссылка на value
int main (void)
{ printf ("value=%d\n", value);
refval+=5; // Модификация через ссылку
printf ("value=%d\n", value);
printf ("Адрес value равен %р\n",&value);
printf ("Адрес refval равен %p\n", &refval);
return 0;
}
Хотя ссылка может быть определена как псевдоним переменной, прежде всего ссылки применяются для параметров функций и возвращаемых функциями значений. Вызов функции, ожидающей в качестве параметра ссылочную переменную, синтаксически не отличается от вызова, в котором параметр передается значением. Чтобы указать, что функция ожидает передачу параметра ссылкой, в прототипе перед именем переменной ставится модификатор &. Рассмотрим пример использования параметров-ссылок.
Пример 11[2].
# includе <stdio.h>
void Inc_val (int i) // Получает параметр-значение
{ i++; // Модификация не влияет на оригинал
}
void Inc_ptr (int *i) // Получает адрес оригинала
{(*i)++; // Модифицирует оригинал путем косвенной адресации
}
void Inc_ref (int & i) // Получает параметр-ссылку
{i++; // Модифицирует оригинал!
}
int main(void)
{ int j=10;
printf ("j=%d \n", j);
Inc_val (j);
printf ("После Inc_val (j) j = %d \n", j);
Inc_ptr (&j);
printf ("После Inc_ptr (j) j=%d \n", j);
Inc_ref (j);
printf ("После Inc_ref (j) j=%d \n", j);
return 0;
}
При вызове функции, ожидающей передачи ссылки, компьютер неявно передает адрес специфицированного параметра. Внутри самой функции компилятор транслирует все обращения к параметру, разыменовывая переданный адрес. При этом:
вызывающей функции не требуется применять операцию взятия адреса (&);
вызываемая функция избавляет от использования косвенных операций (*).
Ссылка может быть использована как тип, возвращаемый функцией. Это позволяет присваивать функции значение.
Пример 12 [2].Ссылка как возвращаемый функцией тип.
#include <stdio.h>
const int arraySize = 0xF;
static int valArray[arraySize];
int &valueAt(int indx)
{ return valArray [indx];
}
int main (void)
{ for (int i=0; i<arraySize; i++)
valueAt (i)=1<<i;
for (i=0; i<arraySize; i++)
printf ("Значение [%2d]= %-6d \n", i, valueAt(i));
return 0;
}
Функцию valueAt(int) можно применять как для чтения элемента с определенным индексом, так и для присваивания нового значения этому элементу.
Приведенный ниже пример иллюстрирует использование двумерного массива в качестве параметра функции.
Пример 13.
#include <stdio.h>
const int row=3; // количество строк
const int col=4; // количество столбцов
int min(int array[][col], int r, int c);
void printArr(int array[][col], int r, int c);
Можно эти прототипы переписать в виде
int min(int [][col], int, int);
void printArr(int [][col], int, int);
main()
{ int m;
int MyArr[row][col]={{2,5,7,4},
{3,2,0,9},
{3,7,8,1}};
printArr(MyArr, row, col);
m=min(MyArr, row, col);
printf("%3d\n",m);
return 0;
}
int min(int array[][col], int r, int c)
{ int minimum=array[0][0];
for (int i=0; i<r; i++)
for (int j=0; j<c; j++)
if (minimum<array[i][j])
minimum=array[i][j];
return minimum;
}
void printArr(int array[][col], int r, int c)
{ int minimum=array[0][0];
for (int i=0; i<r; i++)
{for (int j=0; j<c; j++)
printf("%3d",array[i][j]);
printf("\n");
}
}