Классификация формальных параметров 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Классификация формальных параметров



Формальный параметр скаляр, указатель на скаляр, ссылка на скаляр.

В качестве скаляра будут рассматриваться переменные основных типов, элементы массивов или структур.

Если

1) формальные параметры функции являются:

а) скаляры,

б) указатели на скаляры,

в) ссылки на скаляры,

то фактическими параметрами должны быть:

а) значения скаляров,

б) адреса скаляров,

в) имена скаляров (имена участков памяти);

 

2) формальные параметры: массивы или указатели на массивы,

фактические параметры: имена массивов или имена указателей на массивы;

 

3) формальный параметр:

а) определение структуры,

б) указатель на структуру или массив структур

в) ссылка на структуру;

фактический параметр:

а) имя структуры (копирование структуры),

б) адрес (указатель) структуры или указатель на массив структур,

в) имя структуры (работа со структурой без копирования, т.е имя участка памяти, выделенного под структуру);

 

4) формальный параметр – указатель на функцию

фактический параметр – имя функции

 

I) ФОРМАЛЬНЫЙ ПАРАМЕТР – СКАЛЯР, УКАЗАТЕЛЬ НА СКАЛЯР, ССЫЛКА НА СКАЛЯР

Примеры были рассмотрены выше при рассмотрении передачи параметров по значению, по адресу и по ссылке.

Еще примеры:

1. #include<iostream.h>

void mult (int a, int b, int *s)

{ * s = a * b; }

void main ()

{ int c=3, d=7, s;

mult (c, d, & s) // mult (3, 7, & s)

cout<< s }

2. #include <stdlib.h>

#include <time.h>

#include<iostream.h>

#define n 100

void minmax (int a[n], int & min, int & max)

{ min = max = a[0];

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

if (a[i] < min) min = a[i];

else if (a[i] > max) max = a[i]; }

Void main ()

{ int a[n], min, max;

Randomize ()

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

a[i] =rand();

minmax (a, min, max);

cout << min << max; }

II) ФОРМАЛЬНЫЕ ПАРАМЕТРЫ - МАССИВЫ, УКАЗАТЕЛИ НА МАССИВЫ

Массив в качестве фактического параметра может быть передан в функцию только по адресу, то есть с использованием указателя.

 

Формальный параметр- определение массива:

В качестве формальных параметров можно использовать:

1) определение массива с фиксированными границами, например:

float A[5], int B[3][4][2], char S [25];

2) определение одномерного символьного массива с открытой границей:

char S1[];

При работе со строками, то есть с одномерными массивами данных типа char, последний элемент которых имеет известное значение - '\0', нет необходимости передавать размеры массива

3) определение числового или многомерного символьного массива с открытой левой границей и параметр для передачи размера левой границы:

float A[ ], int B[ ][4][2], char S2 [ ][60], и int n

При всех этих определениях, в стеке выделяется оперативная память на один указатель для передачи в функцию адреса нулевого элемента массива – фактического параметра.

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

Если формальный параметр - массив с фиксированными границами как в первом случае, фактическим параметром будет имя массива из вызывающей программы с теми же фиксированными границами или же значение указателя на такой фиксированный массив.

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

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

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

const int n=4, k =5;

void f (float a [ ] [n][k], int m, float & s)

{s = 0; int t =1;

for (int i=0; i< m; i++) for(int j=0; i< n; j++) for (int l=0; l< k; l++)

{ a[i][j][l]=t++; s+= a[i][j][l];}}

Void main ()

{ float s, dat [3][4][5];

f(dat, 3, s); // вызов функции заполняющей массив dat

cout << s;}

 

I) Формальный параметр - указатель:

1) В качестве формальных параметров определяются:

указатель на первый элемент массива любой мерности и второй параметр – общее количество элементов в массиве:

type*p, int n.

Фактическими параметрамив этом случае будут– указатель типа type*, значение которого -адрес первого элемента массива и второй параметр - значение общего количества элементов в массиве. При этом надо помнить, что имя массива любой мерности – это константный указатель, значением которого является адрес первого элемента массива, однако только для одномерного массива имя – есть указатель на элемент массива, для двумерного массива имя массива – это указатель на строку массива и так далее. Чтобы получить указатель на элемент массива для двумерного массива, надо разыменовать имя массива, для трехмерного массива – два раза разыменовать имя массива и так далее. Или решать проблему явным приведением типов указателей.

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

 

#include<iostream.h>

void f (int*a, int*b, int*c, int n, int m)

{int i, j, p;

for (i=0; i < n+m; i++) //формирование неупорядоченного массива

if (i < n) c[i] = a[i];else c[i] = b[i-n];

// упорядочивание массива методом пузырькового всплытия

for (i = 0; i < n+m-1; i++)

for (j = n+m - 1; j > i; j --)

if (c[j] < c[j-1]){p= c[j]; c[j] = c[j-1]; c[j-1] = p;}

}

int i, a [ ] = {7,9,5,4,0,2,89,33,73,11},

b [ ] = { 23,87,55,45,4,3,0,6,7,3},

n= sizeof(a) / sizeof (a[0]),

m= sizeof(b) / sizeof (b[0]);

//а)создаваемый массив – статический:

void main (){

int c [sizeof(a) / sizeof (a[0])+ sizeof(b) / sizeof (b[0]) ];

// - выделена память на статический массив

f (a, b, c, n, m);

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

cout << c[i] << " ";

}

//б) создается динамический массив:

Void main ()

{int*x = new int [n+m]; // - выделена память на динамический массив

f (a, b, x, n, m);

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

cout << x[i] << " ";

delete [ ] x;

}

2) Формальные параметры - указатели на двумерный массив, размеры которого заранее не известны.

Параметрами являются указатель на массив указателей на строки матрицы: type**p и два значения целого типа: int m - количество этих строк и int n - количество элементов в каждой строке. В этом случае динамически выделяется память и на массив указателей на строки матрицы и на числа в этих строках, таким образом, проводится динамическое выделение памяти на двумерный массив.

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

void mas (int** ptr, int m, int n)

{randomize();

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

for (int j = 0; j < n; j++)

ptr[i][j] = rand();

}

Void main ()

{float **ptr = new float* [m]; // динамическое выделение памяти

// на массив указателей на строки массива

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

ptr[i] = new float [n]; // динамическое выделение памяти на значения в

//строках массива

mas (ptr,5,6); // вызов функции

for (i=0; i< m; i++) delete ptr[i]; // освобождение памяти на значения в строках

delete [ ] ptr; // освобождение памяти на массив указателей на строки

}

3) Формальные параметры указатели - для передачи многомерного массива. Параметрами являются указатель на подмассив и количество подмассивов в многомерном массиве. При этом размеры подмассива должны быть фиксированы.

<type > (* имя_указателя) [ N1][ N2] [N3]…[NN]; - определение указателя на массив размерностью [N1][N2]…[NN] с элементами type.

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

void mas (int (*lp) [3][4], int n)

{ int i, j, k, t=1;

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

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

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

Void main ()

{ int i, j, k, n; cin >> n; // вводится количество матриц в трехмерном массиве

int (*tp) [3][4]; // определен указатель на матрицу

tp = new int [ n ] [3][4];

/* выделена динамическая памятьна n матриц, и адрес первой матрицы присвоен указателю tp */

mas (tp, n); // далее можно работать с элементами массива tp[i][j][k]

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

}

3. Результат функции, возвращаемый с помощью оператора return.

Оператор return - оператор возврата управления программой и значения в точку вызова функции. С помощью этого оператора функция может вернуть одно скалярное значение любого типа. Форма оператора:

return (выражение);

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

К скалярам относятся данные простых стандартных типов, указатели и ссылки. Рассмотрим некоторые возможные результаты работы функций, возвращаемые с помощью оператора return:

1) скалярное значение любого простого типа, например return (5);

2) указатель на скаляр, массив;

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

 



Поделиться:


Последнее изменение этой страницы: 2017-02-19; просмотров: 258; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 44.192.247.185 (0.033 с.)