- •Тема № 1 "Введение в программирование" Происхождение языка Си.
- •Системы программирования
- •Среда программирования Состав языка
- •Алфавит языка
- •Лексемы (cTokens)
- •Вопрос 2
- •Правила объявления переменных в программе
- •Инициализация переменных
- •Унарные операции
- •Бинарные операции
- •Оператор “выражение”
- •Массивы
- •Перечисления
- •Функции
- •Объявление и определение функций
- •Класс памяти
- •Параметры функции
- •Передача массивов в функции
- •Передача многомерных массивов в функции
- •Вызов функции с переменным числом параметров
- •"Файлы и организация ввода-вывода"
- •Например, формула
- •Например, формула
Параметры функции
Использование параметров является основным способом обмена информацией между вызываемой и вызывающей функциями. Параметры, перечисленные в заголовке описания функции, называются формальными, а записанные в операторе вызова функции — фактическими.
При вызове функции в первую очередь вычисляются выражения, стоящие на месте фактических параметров; затем в стеке выделяется память под формальные параметры функции в соответствии с их типом, и каждому из них присваивается значение соответствующего фактического параметра. При этом проверяется соответствие типов и при необходимости выполняются их преобразования. При несоответствии типов выдается диагностическое сообщение. Существует два способа передачи параметров в функцию:
по значению
по адресу.
Передача по значению
Синтаксис при вызове имя_ф(имя факт. парам);
при определении и объявлении тип имя_ф(тип имя форм параметра);
При передаче по значению в стек заносятся копии значений фактических параметров, и операторы функции работают с этими копиями. Доступа к исходным значениям параметров у функции нет, и поэтому при изменении формальных параметров фактические параметры не изменяются..
Передача по адресу
Используется 2 синтаксиса
1. с помощью ссылки.
при вызове имя_ф(имя факт. парам);
при определении и объявлении тип имя_ф(тип &имя форм параметра);
2. с помощью указателя
при вызове имя_ф(&имя факт. парам);
при определении и объявлении тип имя_ф(тип *имя форм параметра);
При передаче по адресу в стек заносятся копии адресов фактич. параметров, а функция осуществляет доступ к ячейкам памяти по этим адресам , т.е при изменении значений формальных параметров значения фактических параметров также изменяется.
При передаче по адресу в качестве фактических параметров нельзя использовать выражения, а только имена переменных
#include <iostream.h>
void f(int , int* . int& );
int main(){
int i = 1. j = 2, k= 3;
cout <<"i j k\n";
cout << i <<' '<< j <<' '<< k <<'\n';
f(i, &j, k);
cout << i <<' '<< j <<' '<< k <<'\n';
return 0;}
void f(int i. int* j. int& k)
{
i++; (*j)++; k++;
}
Первый параметр (1) передается по значению. Его изменение в функции не влияет на исходное значение. Третий параметр (у2) передается по адресу с помощью указателя, при этом для передачи в функцию адреса фактического параметра используется операция взятия адреса, а для получения его значения в функции требуется операция разыменования. Второй параметр (у1) передается по адресу с помощью ссылки.
Пример: Написать программу, вычисляющую значение и 1-ю, 2-ю производные функции у=х3-2х+1 при заданном значении х.
#include <iostream.h>
#include <math.h>
#include <conio.h>
float dif(float, float &, float *);
void main (void)
{float x,p,p1,p2;
cout<<"y=x^3-2x+3"<<endl<<"x=";
cin>>x;
p=dif(x,p1,&p2);
cout<<"y= "<<p<<endl;
cout<<"y'= "<<p1<<endl;
cout<<"y''= "<<p2<<endl;
getche();}
float dif(float t, float &y1, float *y2)
{y1=2*t*t-2;
*y2=6*t;
return pow(t,3)-2*t+1;}
Использование ссылок вместо указателей улучшает читаемость программы, избавляя от необходимости применять операции получения адреса и разыменования. Использование ссылок вместо передачи по значению более эффективно, поскольку не требует копирования параметров, что имеет значение при передаче структур данных большого объема.