
- •Введение
- •Разработка функций рекурсивных и без рекурсии, использующих параметр – функцию и оператор return
- •Return (выражение);
- •Функция возвращает значение любого простого типа
- •Функция возвращает указатель на скаляр, массив, структуру, файл или функцию
- •А) Функция возвращает указатель на скаляр
- •Б) Функция возвращает указатель на первый элемент одномерного массива
- •3) Ссылка - возвращаемый результат функции
- •Return имя переменной;
- •2.2.2 Рекурсивные функции
- •2.2.3 Указатели на функции
- •( * Имя указателя) (список фактических параметров);
- •2.2.4 Массивы указателей на функции
- •2.2.5 Определение типа указателя на функцию
- •2.2.6 Указатель на функцию - параметр функции
- •2.3 Задание на выполнение лабораторной работы
- •Порядок выполнения работы
- •Пример выполнения лабораторной работы
- •2.6 Контрольные вопросы
- •2.7 Варианты заданий лабораторной работы
- •Лабораторная работа № 6 Разработка программ с использованием структурированных данных
- •3.1 Цель лабораторной работы
- •Теоретические сведения
- •3.2.1 Структурные типы и структуры
- •Для обращения к элементам, входящим в состав конкретной структуры используются уточненные имена:
- •(*Имя указателя). Имя элемента структуры
- •3.2.2 Инициализация структур
- •3.2.3 Динамическое выделение памяти под структуру и массив структур
- •Элементы структур
- •Элементы структуры могут иметь одинаковый тип, тогда при описании таких элементов можно указывать их общий тип, а имена перечислить через запятую:
- •Struct def { def a , int b; } ; // - ошибка!
- •Strspy ( a.Fio, “ Петров”) ;
- •3.2.5 Структуры и функции
- •3.2.6 Использование массива указателей, инициированного строками
- •3.3 Задание на выполнение лабораторной работы
- •3.4 Порядок выполнения работы
- •3.5. Пример выполнения лабораторной работы
- •3.6 Контрольные вопросы
- •3.7 Варианты заданий лабораторной работы
- •4. Список литературы
Б) Функция возвращает указатель на первый элемент одномерного массива
С указателем можно связать динамический одномерный массив с помощью операции new. Действительно new выделяет память для элементов массива нужного размера и возвращает адрес первого элемента, которым можно инициализировать указатель на элемент массива:
type*имя = new type[размер_массива];
Таким образом, указатель связывается с участком памяти, выделяемым динамически для массива данных.
Такой указатель может возвращать с помощью оператора return функция, в которой формируется динамический одномерный массив, тем самым, возвращая “указатель на одномерный динамический массив”.
Пример: определить и вызвать функцию, формирующую одномерный динамический массив, заполняя его значениями, вводимыми с клавиатуры. Формальный параметр функции – количество элементов в формируемом массиве. Функция возвращает указатель на первый элемент массива.
int * vvod ( int n) // параметр функции –количество элементов массива,
// функция возвращает значение указателя (адреса),
//первого элемента формируемого динамического массивом;
{
int* p ; // указатель на элемент формирующегося массива;
p = new int [n] ; // динамическое выделение памяти под массив,
//адрес участка памяти присваивается указателю p;
for ( int i=0 ; i < n ; i++ )
cin >> p[i] ;
return p ; //возвращается указатель (адрес) на первый элемент массива;
}
void main ( )
{
int * dat , n ; // объявляется указатель на элемент массива и
//количество элементов;
cin >> n; // вводится с клавиатуры количество элементов;
dat = vvod (n) ; //указателю присваивается результат вызова функции;
for ( int i=0 ; i < n ; i++ ) // поэлементный вывод на экран элементов
cout << dat[i]<<’\t ‘; // сформированного массива;
. . .
delete dat ; // динамическое освобождение памяти;
}
в) - Функция возвращает указатель на указатель на элемент массива
Многомерный массив с переменными размерами, сформированный в функции, вернуть в вызывающую программу как результат функции непосредственно невозможно.
Однако возвращающим значением функции может быть указатель на одномерный массив указателей на одномерные массивы (“двойной указатель”).
Двумерный массив можно рассматривать как одномерный массив одномерных массивов – строк массива. Действительно, с этой точки зрения, если в массиве m строк и n столбцов, двумерный массив представляет собой m одномерных массивов, в которых по n элементов.
При динамическом выделении памяти на двумерный массив надо m раз выделить память на одномерные массивы – строки матрицы, так как это было описано в предыдущем разделе. Для этого понадобиться m указателей на элементы массива, причем m может быть заранее не известно. С помощью указателя на указатель на элемент массива возможно формирование динамического одномерного массива указателей. Если затем каждый указатель такого массива “связать” с участком памяти, выделяемым динамически на одну строку данных, то будет выделена память на двумерный массив, количество строк в котором равно количеству указателей в динамическом массиве указателей.
И именно этот указатель на указатель можно возвратить с помощью оператора return из функции, которая формирует двумерный динамический массив, и тем самым возвратить “указатель на двумерный массив”.
Пример: определить и вызвать функцию, формирующую и возвращающую двумерный динамический массив натуральных чисел, размеры массива – аргументы функции.
int ** mas ( int m , int n ) // параметры функции – количество строк и
// столбцов массива, функция возвращает значение указателя на указатель;
{ int k=1;
int ** ptr ; // указатель на указатель на элемент
ptr = new int* [m ] ; // указателю присваивается адрес участка памяти,
// выделенного на динамический массив из m указателей;
for ( int i=0 ; i < m ; i++ ) //затем в цикле
ptr [i] = new int [ n] // каждому указателю массива указателей
//присваивается адрес участка памяти, который динамически
//выделяется на каждую строку двумерного массива,
//состоящую из n элементов типа int;
for ( int i =0 ; i < m ; i++ ) // поэлементное заполнение массива
// последовательными натуральными числами
// и вывод его элементов;
{ cout <<”\n” ;
for ( int j =0 ; j < n; j++ )
{ ptr [ i] [j] = k++ ; cout << ptr [i][j] << “ “ ; }
}
return ptr ; // возвращается указатель на указатель или
// “указатель на матрицу”;
}
void main ( )
{
int n , m ,i ,j;
cout<<”Введите количество строк и столбцов массива\n”;
cin>> n>>m; // размеры массива вводятся с клавиатуры;
int ** Q; // определен двойной указатель для формируемой матрицу;
Q = mas ( m , n ) ; //указателю присваивается результат вызова функции;
. . .
Q[i][j] // обращение к элементам динамического массива
. . .
// освобождение памяти
for ( i=0 ; i < m ; i++ ) // сначала освобождается память, выделенная под
delete Q[i] ; //каждую строку данных массива;
delete [ ] Q; //освобождается память, выделенная под массив указателей
//на строки массива;
}