- •Основные характеристики алгоритмического языка Си
- •Идентификаторы
- •Вопрос 2
- •Константы
- •Целый тип (int)
- •Символьный тип (char)
- •Инициализация переменных
- •Определение именованных констант
- •Унарные операции
- •Бинарные операции
- •Преобразование типов
- •Внимание!
- •Оператор принятия решений switch
- •Оператор цикла while
- •Оператор цикла do/while
- •Оператор continue
- •Оператор goto
- •Указатели
- •Int *a. B, *c; описываются два указателя на целое с именами а и с, а также целая переменная b.
- •Инициализация указателей
- •Массивы
- •Внимание
- •Связь массива с указателем.
- •Многомерные массивы.
- •Функции
- •Объявление и определение функций
- •Локальные и глобальные переменные.
- •Класс памяти
- •Параметры функции
- •Передача массивов в функции
Параметры функции
Использование параметров является основным способом обмена информацией между вызываемой и вызывающей функциями. Параметры, перечисленные в заголовке описания функции, называются формальными, а записанные в операторе вызова функции — фактическими.
При вызове функции в первую очередь вычисляются выражения, стоящие на месте фактических параметров; затем в стеке выделяется память под формальные параметры функции в соответствии с их типом, и каждому из них присваивается значение соответствующего фактического параметра. При этом проверяется соответствие типов и при необходимости выполняются их преобразования. При несоответствии типов выдается диагностическое сообщение. Существует два способа передачи параметров в функцию:
по значению
по адресу.
Передача по значению
Синтаксис при вызове имя_ф(имя факт. парам);
при определении и объявлении тип имя_ф(тип имя форм параметра);
При передаче по значению в стек заносятся копии значений фактических параметров, и операторы функции работают с этими копиями. Доступа к исходным значениям параметров у функции нет, и поэтому при изменении формальных параметров фактические параметры не изменяются..
Передача по адресу
Используется 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;}
Использование ссылок вместо указателей улучшает читаемость программы, избавляя от необходимости применять операции получения адреса и разыменования. Использование ссылок вместо передачи по значению более эффективно, поскольку не требует копирования параметров, что имеет значение при передаче структур данных большого объема.