Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CИ-часть3студ.doc
Скачиваний:
12
Добавлен:
09.02.2015
Размер:
196.1 Кб
Скачать

6.3.Передача параметров

Механизм фактических и формальных параметров является основным способом обмена данными между вызывающей и вызываемой функциями. В вызываемую функцию через параметры передаются данные, являющиеся исходными для счёта (такие параметры называют входными), и возвращаются полученные результаты (такие параметры называют выходными).Поскольку результатов может быть несколько, то рассмотренный способ передачи результатов с помощью оператора return не позволяет решить поставленную задачу. Рассмотрим основные способы передачи параметров в функцию.

Существуют два способа передачи – по значению и по адресу.

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

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

Если требуется запретить изменение внутри функции параметра, передаваемого по адресу, то используется модификатор const перед его описанием в заголовке функции. Такое объявление облегчает отладку программ, так как в этом случае легко определить, какие величины можно изменять внутри функции, а какие нет. Кроме того, при передаче параметров параметра по адресу с модификатором const в качестве фактического параметра можно использовать выражение, если оно допустимо типом параметра. Так, для библиотечной функции printf, имеющей заголовок int printf(const char *_Format,…), в качестве первого фактического параметра можно задавать не только строковую константу, например, "%f%f", но и строковую переменную с таким значением или склейку строк, приводящую к такому же значению. Справка: заголовок любой функции в тексте программы можно увидеть во всплывающей подсказке, подведя курсор мыши к её имени.

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

Подводя итог, можно также сказать: в объявлениях и заголовках подпрограмм желательно использовать модификатор const даже в тех случаях, когда не вникая в суть её назначения и алгоритма надо знать, возможно ли изменение значения в ячейке памяти стека для параметра-значения и должно ли быть или нет изменение фактического параметра при передаче по адресу т.е. является ли параметр только входным (если задан с const), или только выходным и, возможно, также входным (если задан без const).

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

// передача параметров по адресу

#include "stdafx.h"

#include "stdio.h"

#include "conio.h"

void sumpr(float a,float b,float *s,float *pr);

int _tmain(int argc, _TCHAR* argv[])

{ float c,d,sum,pr;

printf("wwedite dwa chisla\n");

scanf("%f%f",&c,&d);

sumpr(c,d,&sum,&pr);//передача адресов переменных sum и pr, являющихся

//результатами

printf("\nsumma=%6.2f proiswedenie=%6.2f",sum,pr);

getch();

return 0;

}

void sumpr(float a,float b,float *s,float *pr)

{ *s=a+b;

*pr=a*b;

}

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