Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Uchebnoe_posobie_S.docx
Скачиваний:
17
Добавлен:
11.04.2015
Размер:
840.53 Кб
Скачать

Механизмы замены параметров

В языке С++ существует два механизма передачи параметров в функции: по значению и по адресу.

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

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

Рассмотрим два примера, иллюстрирующих механизмы передачи параметров:

Пример 1 Пример 2

#include "stdafx.h" #include "stdafx.h"

void Z (int у) void Z (int *у)

{ {

y=l; *y=1;

} }

void main() void main()

{ int х; { int х;

x=0; х=0;

Z(x);//обращение к функции Z Z(&x);//обращение к функции Z

printf("x=%d", x); printf("x=%d", x);

} }

В примере 1 функция Z() содержит формальный параметр у, который передается по значению, поэтому его измене­ние в процедуре (у=1;) не влияет на значение фактического параметра х. После выполнения программы на экран будет выведено: х=0.

В примере 2 у функции Z() формальный параметр у – это указатель. В него передается при вызове функции Z() адрес фактического параметра x. Это означает, что функция Z() изменяет значение y в той же ячейки памяти, где находится значение фактического параметра x . На экран будет выведено:

х = 1.

Параметры-массивы в функциях

Массивы, так же как и простые переменные, можно передавать в функции в качестве параметров. Так как имя массива – это адрес, то передача массива происходит всегда по адресу.

Рассмотрим, например, функцию, вычисляющую среднее значение элементов массива. Желательно сделать ее так, чтобы в нее можно было передавать массив любого размера. В языке С++ функции не могут самостоятельно определять размер массива, поэтому он (размер) должен быть обязательно одним из параметров.

#include "stdafx.h"

int Sum ( int A[], int N )//заголовок функции

{

int i, sum; //локальные переменные

sum = 0;

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

sum += A[i];

return sum/N; //возвращаемое значение

}

void main()

{

int x[5]={1,2,3,4,5},

y[3]={11,22,33};

printf("\n sr x=%d sr y=%d\n", Sum(x,5),Sum(y,3));

}

Обратите внимание, что в заголовке функции Sum размер N массива указан отдельным параметром. Нельзя объявлять массив-параметр как A[N], а только как A[] или *A.

Если в функцию передаётся двумерный массив, то описание соответствующего параметра функции должно содержать количество столбцов; количество строк - несущественно, поскольку фактически передаётся указатель. Например, так: int Х[ ][5], или Х[5][5].

Рассмотрим пример функции, перемножающей матрицы А и В; результат - матрица С. По правилам математики перемножать можно матрицы, размеры которых (mxn) и (nxk) соответственно. Результирующая матрица будет иметь размеры (mxk).

const nmax = 50;

void product(int А[][nmax], int В[][nmax],int С[][nmax], int m, int n, int k)

{ /* m - число строк в матрице А;     n - число строк в матрице В и число столбцов в матрице А;     k - число столбцов в матрице В.  */

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

{      С[i][j]=0;      for (int l=0; l< n; l++)

С[i][j] + = А[i][l]*В[l][j];      }      }

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

В приведённом примере есть недостаток - здесь заранее фиксируется максимальная размерность матриц. Но использоваться может только часть памяти.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]