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

Int main ( )

{

float*dat; int n;

cin>> n; // вводится с клавиатуры количество элементов;

dat = vvod (n); //указателю присваивается результат вызова функции;

for (int i=0; i < n; i++) // поэлементный вывод на экран элементов массива

cout << dat[i] << "\t";

delete [] dat; // освобождение памяти;

system("pause");

return 0;

}

Функция возвращает указатель на указатель на элемент массива (“двойной указатель”)

С помощью указателя на указатель на элемент массива в теле функции может быть сформирован двумерный динамический массив. Этот указатель на указатель можно быть возвращен как результат работы функции с помощью оператора return, и тем самым возвращен "указатель на двумерный массив".

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

int** mas (int m, int n)

{int k=1;

int ** ptr= new int* [m ]; //выделение памяти на массив

//из m указателей на int;

for (int i=0; i < m; i++)

ptr [i] = new int [ n]; //выделение памяти, для каждой строки из n элементов

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;

} // возвращается "указатель на матрицу"

Int main ( )

{

int n , m ,i ,j;

cin>> n>>m;// размеры массива вводятся с клавиатуры;

int ** Q = mas (m, n ); //указателю присваивается результат вызова функции;

//… Q[i][j] - обращение к элементам динамического двумерного массива

//освобождение памяти

for (i=0; i < m; i++) delete Q[i];

delete [ ] Q;

system("pause");

return 0;

}

Результат функции - указатель на подмассив.

Определим в качестве примера функцию, возвращающей значение указателя на подмассив (4х5) элементов типа int, которое является адресом первой матрицы трехмерного массива, сформированного в функции.

#include <iostream>

typedef int (*TPM)[4][5]; //TPM - тип указателя на матрицу 4х5

TPM fun (int n) //параметр функции – количество подмассивов в массиве

{

int i, j, k, t=1;

TPM lp=new int [n][4][5]; // выделяем память на трехмерный массив

for (i=0; i < n; i++){cout << "\n\n";

for (j=0; j < 4; j++){ cout << "\n";

for (k=0; k< 5; k++){lp[i][j][k]=t++; cout <<lp [i][j][k] << " ";} } }

return lp;

}

Int main ()

{ int n, i, j , k; cin>>n;

TPM D=fun(n); //вызов функции

//D[i][j][k] - обращение к элементам трехмерного массива

delete []D; //освобождение памяти

system("pause");

return 0;

}

Ссылка - возвращаемый результат функции

Ссылки не являются настоящими объектами, ссылка связана с участком памяти инициализирующего ее выражения.

Если функция возвращает ссылку, это означает, что функция должна возвращать не значение, а идентификатор для обращения к некоторомуучастку памяти, в простейшем случае имя переменной. Таким образом, в функции должен быть, например, такой оператор: return имя переменной;

При этом следует помнить, что в операторе return не должно стоять имя локальной переменной, так как после вызова функции участки памяти, связанные в сегменте стека с локальными переменными, становятся недоступными. Таким образом, в операторе должно стоять имя участка памяти из внешней программы.

Вызов такой функции представляет собой частный случай l-значения (l-value), которое представляет в программе некоторый участок памяти. Этот участок памяти может иметь некоторое значение и это значение можно изменять, например, в операторе присваивания.

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

Следующая функция, возвращающая ссылку на элемент массива c максимальным значением, проиллюстрирует вышесказанное. Массив передается в функцию посредством параметра.