Скачать презентацию Указатели Указатель это переменная значением которой Скачать презентацию Указатели Указатель это переменная значением которой

prog_lk8_new.pptx

  • Количество слайдов: 99

Указатели • Указатель — это переменная, значением которой является адрес памяти, по которому хранится Указатели • Указатель — это переменная, значением которой является адрес памяти, по которому хранится объект определенного типа (другая переменная). Пример: если ch — это переменная типа char, а p — указатель на ch, значит в p находится адрес, по которому в памяти компьютера хранится значение переменной ch.

Указатели и массивы • При создании любого массива в C++, вместе с ним естественным Указатели и массивы • При создании любого массива в C++, вместе с ним естественным образом создаётся указатель. • Имя этого указателя совпадает с именем массива. • В появившемся указателе хранится адрес начального элемента массива. • Чтобы начало массива не было потеряно этот указатель является константным, т. е. его нельзя направить на какой то другой элемент массива или записать туда адрес другой переменной даже подходящего типа.

Указатели и массивы Получение адреса первого элемента массива: p 1=plus; и p 1=&plus[0] Указатели и массивы Получение адреса первого элемента массива: p 1=plus; и p 1=&plus[0]

Пример 6 ой элемент массива plus можно определить: plus[5] или *(p 1+5) Пример 6 ой элемент массива plus можно определить: plus[5] или *(p 1+5)

Пример Преимущество ис пользования второго варианта *(p 1+5) состоит в том, что арифме тические Пример Преимущество ис пользования второго варианта *(p 1+5) состоит в том, что арифме тические операции над указателями выполняются быст рее, если мы работаем с подряд идущими элементами массива. Если же выбор элементов массива случайный, то быстрее и более наглядна работа с индексами plus[5].

Массивы указателей • Как и любые другие переменные, указатели можно группировать в массивы. • Массивы указателей • Как и любые другие переменные, указатели можно группировать в массивы. • Объявление массива целочисленных указателей из десяти элементов: int *х[10]; • Присвоение адреса целочисленной переменной var третьему элементу массива: х[2] = &var; • Получение значения var: *х[2];

Типы данных, определяемые пользователем Типы данных, определяемые пользователем

Виды заказных типов данных • • • структуры (structure); поля битов (bit fields); объединения Виды заказных типов данных • • • структуры (structure); поля битов (bit fields); объединения (union); перечисления (enumeration); новое имя типа (typedef).

Структуры Структуры

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

Формат объявления структуры struct [имя структуры] { <базовый тип 1> <имя переменной 1>; <базовый Формат объявления структуры struct [имя структуры] { <базовый тип 1> <имя переменной 1>; <базовый тип 2> <имя переменной 2>; } [структ. переменная 1[, структ. переменная 2 . . . ];

Пример struct addr { char zip [6]; char city [20]; char street [40]; char Пример struct addr { char zip [6]; char city [20]; char street [40]; char name [30]; }; //Установка структурного шаблона (маски структуры)

Структуры • Структурный шаблон (маска) определяют только вид данных, но не объявляет никаких переменных. Структуры • Структурный шаблон (маска) определяют только вид данных, но не объявляет никаких переменных. • Объявление фактической переменной: struct addr_info; Структура addr_info размещается в памяти: почтовый индекс 6 байтов; город 20 байтов; улица 40 байтов; имя 30 байтов.

Примечание 1 Если требуется единственная структурная переменная, то включать имя структуры не нужно. struct Примечание 1 Если требуется единственная структурная переменная, то включать имя структуры не нужно. struct { char zip[6]; char city[20]; char str[40]; char name[30]; } addr_info;

Примечание 2 При объявлении структуры можно объявить более одной переменной. struct addr { char Примечание 2 При объявлении структуры можно объявить более одной переменной. struct addr { char zip[6]; char city[20]; char str[40]; char name[30]; } addr_info, a, b;

Обращение к элементам структуры Для обращения к отдельным элементам структуры используется оператор “точка” (dot Обращение к элементам структуры Для обращения к отдельным элементам структуры используется оператор “точка” (dot . ). Формат обращения: <имя структурной переменной>. <имя элемента>

Примеры addr_info. zip=125195; Почтовый индекс 125195 присваивается полю zip структурной переменной addr_info, которая была Примеры addr_info. zip=125195; Почтовый индекс 125195 присваивается полю zip структурной переменной addr_info, которая была объяв лена ранее. printf(“%d”, addr_info. zip); Вывод на экран почтово го ндекса. и gets(addr_info. name); Прочитать имя.

Примеры Если элементом структуры является другая структура, то доступ к ее элементам выполняется через Примеры Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора: struct А {int а; double х; }; struct В {А а; double х; } х[2]; х[0]. а. а = 1; х[1]. х = 0. 1; Примечание: поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости.

Структуры Имя структуры можно использовать сразу после его объявления (определение можно дать позднее) в Структуры Имя структуры можно использовать сразу после его объявления (определение можно дать позднее) в тех случаях, когда компилятору не требуется знать размер структуры. struct List; . // объявление структуры List struct Link{ List *p; // указатель на структуру List Link *prev, *succ; // указатели на структуру Link }; struct List { / * определение структуры List * / }; //позволяет создавать связные списки структур

Пример Посимвольная печать содержимого addr_info. name, т. е. осуществляется доступ к конкретным элементам addr_info. Пример Посимвольная печать содержимого addr_info. name, т. е. осуществляется доступ к конкретным элементам addr_info. name: register int t; for (t=0; addr_info. name[t]; ++t) putchar(addr_info. name[t]);

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

Пример struct addr_info[100]; // объявлен 100 элементный массив структур addr; printf(“%d”, addr_info[2]. zip); //печатается Пример struct addr_info[100]; // объявлен 100 элементный массив структур addr; printf(“%d”, addr_info[2]. zip); //печатается почтовый индекс из второй структуры; Примечание. Как все переменные типа массив, массивы структур начинают индексирование своих элементов с нуля.

Инициализация массивов структур • При инициализации массивов структур следует заключать в фигурные скобки каждый Инициализация массивов структур • При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива (учитывая, что многомерный массив — это массивов) struct complex{ float real, im; } compl [2][3] = { {{1. 1}}. // строка 1, т. е. массив compl[0] {{2. 2}} // строка 2, т. е. массив compl[1] };

Битовые поля Битовые поля

Битовые поля В языке С++ имеется возможность доступа к отдельному биту внут ри байта. Битовые поля В языке С++ имеется возможность доступа к отдельному биту внут ри байта. Преимущества использования: • при ограниченной памяти можно хранить не сколько булевых переменных в одном байте; • интерфейсы некоторых устройств передают ин формацию, которая кодируется в биты внутри одного бай та; • некоторые программы кодирования нуждаются в доступе к битам внутри байта.

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

Битовые поля При описании битового поля после имени через двоеточие указывается длина поля в Битовые поля При описании битового поля после имени через двоеточие указывается длина поля в битах (целая положительная константа): struct <имя структуры> { имя типа 1 : длина; имя типа 2 : длина; };

Битовые поля Битовое поле может быть объявлено как: • int (целое); • unsigned (без Битовые поля Битовое поле может быть объявлено как: • int (целое); • unsigned (без знака); • signed (со знаком). Примечание. Битовое поле единичной длины должно объ являться как nsigned, т. к. u единичный бит не может иметь знак.

Пример struct Options{ bool center. X: 1; bool center. Y: 1; unsigned int shadow: Пример struct Options{ bool center. X: 1; bool center. Y: 1; unsigned int shadow: 2; unsigned int palette: 4; };

Примечания • Битовые поля могут быть любого целого типа. • Доступ к полю осуществляется Примечания • Битовые поля могут быть любого целого типа. • Доступ к полю осуществляется обычным способом — по имени. • Адрес поля получить нельзя, однако в остальном битовые поля можно использовать точно так же, как обычные поля структуры. • Операции с отдельными битами реализуются гораздо менее эффективно, чем с байтами и словами. • Размещение битовых полей в памяти зависит от компилятора и аппаратуры.

Объединения (union) Объединения (union)

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

Объединения • Элементы объединения перекрывают друга. union tom { char ch; int x; } Объединения • Элементы объединения перекрывают друга. union tom { char ch; int x; } t;

Пример union кар // Это определение не объявляет переменных { int i; char ch; Пример union кар // Это определение не объявляет переменных { int i; char ch; }; union кар a; // Переменная а типа kар

Объединения (union) В переменной а целое i и символьное ch разделя ют одну область Объединения (union) В переменной а целое i и символьное ch разделя ют одну область памяти (однако, i занимает два байта, а ch один). При объявлении объединения (union), С++ автома тически создает переменную, достаточную для того, чтобы хранить переменную самого большого типа в этом union. Для доступа к элементу union используется тот же синтаксис, что и в структурах: оператор точки. Объединения в С++ часто используют в тех случаях, когда необходимы преобразования типов.

Пример enum paytype {CARD, CHECK}; struct{ paytype ptype; union payment{ char card[25]; long check; Пример enum paytype {CARD, CHECK}; struct{ paytype ptype; union payment{ char card[25]; long check; } } info; /* присваивание значений ptype */ switch (ptype){ case CARD: cout << "Оплата no карте: “; cin >> info. card; break; case CHECK: cout << "Оплата чеком: “; cin >> info. check; break; }

Пример #include <iostream> using namespace std; union my. U { short int name 1; Пример #include using namespace std; union my. U { short int name 1; int name 2; long int name 3; } my. Union; int main() { my. Union. name 1 = 22; cout << my. Union. name 1 << endl; my. Union. name 3 = 22222; cout << my. Union. name 3 << endl; cout << my. Union. name 1 << endl; // снова обращаемся к name 1 }

Перечисления Перечисления

Перечисления позволяют определить несколько именованных констант, для которых требуется, чтобы все они имели различные Перечисления позволяют определить несколько именованных констант, для которых требуется, чтобы все они имели различные значения (при этом конкретные значения могут быть не важны). У перечисляемого типа данных все возможные значения задаются списком целочисленных констант. Формат: enum [ имя_типа ] { список_констант };

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

Пример 1 enum Err {ERR__READ, ERR__WRITE, ERR_CONVERT}; Err error; switch (error){ case ERR_READ: /* Пример 1 enum Err {ERR__READ, ERR__WRITE, ERR_CONVERT}; Err error; switch (error){ case ERR_READ: /* операторы */ break; case ERR_WRITE: /* операторы */ break; case ERR_CONVERT: /* операторы */ break; } //Константам ERR_READ, ERR_WRITE, ERR_CONVERT присваиваются значения 0, 1 и 2 соответственно.

Пример 2 enum coin {penny, nickel, dime, quarter, halfdollar, dollar}; enum coin money; printf(“%d%d, Пример 2 enum coin {penny, nickel, dime, quarter, halfdollar, dollar}; enum coin money; printf(“%d%d, penny, dime); //будет напечатано 0 и 2

Пример 3 enum {two = 2, three, four, ten = 10, eleven, fifty = Пример 3 enum {two = 2, three, four, ten = 10, eleven, fifty = ten + 40}; //Константам three и four присваиваются значения 3 и 4, константе eleven — 11.

Перечисления • Имена перечисляемых констант должны быть уникальными, а значения могут совпадать. • Преимущество Перечисления • Имена перечисляемых констант должны быть уникальными, а значения могут совпадать. • Преимущество применения перечисления перед описанием именованных констант и директивой #define состоит в том, что связанные константы нагляднее. • Компилятор при инициализации констант может выполнять проверку типов. • При выполнении арифметических операций перечисления преобразуются в целые.

Переименование типов (typedef) Переименование типов (typedef)

Переименование типов используется для того чтобы сделать программу более ясной. Задать типу новое имя Переименование типов используется для того чтобы сделать программу более ясной. Задать типу новое имя можно с помощью ключевого слова typedef: typedef тип новое_имя [ размерность ];

Пример typedef unsigned int UINT; typedef char Msg[100]; typedef struct{ char f 1 o[30]; Пример typedef unsigned int UINT; typedef char Msg[100]; typedef struct{ char f 1 o[30]; int date, code; double salary; } Worker; UINT i, j ; // две переменных типа unsigned int Msg str[10]; // массив из 10 строк по 100 символов Worker staff[100]; // массив из 100 структур

Cпецификаторы класса хранения Cпецификаторы класса хранения

Cпецификаторы класса хранения (модификаторы хранения) Cпецификаторы класса хранения сообщают компилятору, как хранить следующую за Cпецификаторы класса хранения (модификаторы хранения) Cпецификаторы класса хранения сообщают компилятору, как хранить следующую за ним переменную. • auto; • extern; • static; • register.

Спецификатор auto используется для объявления локальных переменных (локальные переменные являются auto по умолчанию). Спецификатор auto используется для объявления локальных переменных (локальные переменные являются auto по умолчанию).

Спецификатор extern используeтся при объявле нии переменных в многофайловых программах. Т. к. С++ позволяет Спецификатор extern используeтся при объявле нии переменных в многофайловых программах. Т. к. С++ позволяет выполнять раздельную компиляцию модулей для большой программы, существует способ передачи информации о глобальных переменных файлам программы. Все глобальные переменные объявляются в одном файле и используются при объявлении в других файлах слова extern.

Пример Файл 1 int х, у; char ch; Файл 2 extern int x, y; Пример Файл 1 int х, у; char ch; Файл 2 extern int x, y; extern char ch; main(void) {. . . } void func 22(void) { х= у/ 10; } void func 1 (void) { x = 23; } void func 23(void) { y=10; }

Спецификатор extern сообщает компилятору, что следующие за ним типы и имена переменных объявляются где Спецификатор extern сообщает компилятору, что следующие за ним типы и имена переменных объявляются где то в другом месте. Т. о. extern позволяет компилятору знать о типах и именах глобальных переменных без действительного создания этих переменных. Когда два модуля объединяются, все ссылки на внешние переменные пересматриваются.

Спецификатор static • Спецификатор static используется для объявления переменных, которые являются постоянными переменными внутри Спецификатор static • Спецификатор static используется для объявления переменных, которые являются постоянными переменными внутри функции или файла. • Они отличаются от глобальных переменных, поскольку не известны за пределами функции или файла, но могут хранить свои значения между вызовами.

Статические локальные переменные • Когда static применяется к локальной переменной, это приводит к тому, Статические локальные переменные • Когда static применяется к локальной переменной, это приводит к тому, что компилятор создает долговременную область для хранения переменной почти таким же способом, как это делается для глобальной переменной. • Ключевое различие между статической локальной и глобальной переменными заключается в том, что статическая локальная переменная остается известной только в том блоке, в котором она была объявлена. • Статическая локальная переменная это локальная переменная, сохраняющая свое значение между вызовами функций.

Статические глобальные переменные • Когда спецификатор static применяется к глобальной переменной, он сообщает компилятору Статические глобальные переменные • Когда спецификатор static применяется к глобальной переменной, он сообщает компилятору о необходимости создания глобальной переменной, которая будет известна только в файле, где статическая глобальная переменная объявлена. • Это означает, что, даже если переменная является глобальной, другие подпрограммы в других файлах не будут знать о ней.

Статические глобальные переменные • Имена статических локальных переменных известны только функции или блоку кода, Статические глобальные переменные • Имена статических локальных переменных известны только функции или блоку кода, в которых они объявлены, а имена статических глобальных переменных известны только в файле, в котором они находятся. • В сущности модификатор static разрешает использование функциями переменных, не беспокоя другие функции.

Спецификатор register • Спецификатор register применяется только к пе ременным типа nt и char. Спецификатор register • Спецификатор register применяется только к пе ременным типа nt и char. i • Используется для объявле ния переменных, которые хранятся не в ОП, а в регистрах ЦП (для экономии времени). • Подобная экономия делает register переменные идеальными для управления циклом. • Допускается применять к локальным перемен ным и к формальным параметрам в функции, но нельзя использовать для глобальных переменных.

Спецификатор register • Количество регистровых переменных в С++ ограни чено вумя. д • С Спецификатор register • Количество регистровых переменных в С++ ограни чено вумя. д • С автоматически делает регистровые перемен ные нерегистровыми, как только количество регистровых переменных достигнет предела.

Функции Функции

Подпрограммы • В основе конструкции функций лежит понятие подпрограммы, впервые введенное в 1957 г. Подпрограммы • В основе конструкции функций лежит понятие подпрограммы, впервые введенное в 1957 г. М. Уилксом. • Подпрограмма это само стоятельный фрагмент программы, оформленный особым способом, которой присвоено имя. • Подпрограмма – это одна из базовых структур в структурном программи ровании, позволяющая избежать повторных записей одинаковых фрагментов в программе. • Подпрограммы в C++ реализуются в виде функций.

Функции • В языке C++ нет деления на процедуры и функции. • В C++ Функции • В языке C++ нет деления на процедуры и функции. • В C++ программа состоит только из функций. • Функция это независимая совокупность объявле ний и операторов, обычно предназначенная для выполне ния определенной задачи. • Каждая функция имеет имя, которое используется для вызова функции.

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

Объявление функции • Формат описания функции: [тип] <имя функции> (список параметров) { тело функции Объявление функции • Формат описания функции: [тип] <имя функции> (список параметров) { тело функции }

Объявление функции • Тип определяет тип значения, которое возвращает функция с помощью оператора return. Объявление функции • Тип определяет тип значения, которое возвращает функция с помощью оператора return. • Если тип не ука зан, то по умолчанию предполагается, что функция воз вращает целое значение (типа int). • Список параметров состоит из перечня типов и имен параметров, разделен ных запятыми. • Функция может не иметь параметров, но круглые скобки необходимы в любом случае.

Объявление функции • В списке параметров для каждого параметра дол жен быть указан ип: Объявление функции • В списке параметров для каждого параметра дол жен быть указан ип: т f(int х, int у, float z)

Оператор return имеет два варианта использова ния : • оператор вызывает немедленный выход из Оператор return имеет два варианта использова ния : • оператор вызывает немедленный выход из текущей функции и возврат в вызывающую про грамму ; • оператор используется для возврата значения функции. В теле функции может быть не сколько операторов eturn, может не быть ни одного. В этом случае возврат в r вызывающую программу проис ходит после выполнения последнего оператора тела функции.

Пример 1 //Функция находит max из двух чисел. max(int a, int b) { int Пример 1 //Функция находит max из двух чисел. max(int a, int b) { int m; if (a>b) m=а; else m=b; return m; }

Пример 1 //Та же функция, но без использования до полнительной переменной m max(int a, Пример 1 //Та же функция, но без использования до полнительной переменной m max(int a, int b) { if (a>b) return a; else return b; }

Пример 1 //Укороченная запись той же функции max(int a, int b) { if (a>b) Пример 1 //Укороченная запись той же функции max(int a, int b) { if (a>b) return a; return b; }

Пример 1 //Еще более короткая запись той же функции max(int a, int b) { Пример 1 //Еще более короткая запись той же функции max(int a, int b) { return (a>b)? a: b; }

Пример программы #include <iostream> #include <conio. h> using namespace std; int max(int a, int Пример программы #include #include using namespace std; int max(int a, int b); // Объявление функции int main() { int a=50, b=100, d; cout << " a= " << a << " b= " << b << endl; d=max(a, b); cout << " max(a, b)= " << d << endl; while (!kbhit()); return 0; } int max(int a, int b) // Описание функции { return (a>b)? a: b; }

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

Возвращаемые значения • Использование функций, возвращающих указате ли, имеют некоторые особенности. • Указатели не Возвращаемые значения • Использование функций, возвращающих указате ли, имеют некоторые особенности. • Указатели не являются ни типом целое (int), ни типом беззнаковое целое (unsigned int). • Их значениями являются адреса памяти данных определенного типа, соответственно должна быть описана и функция.

Пример //описание функ ции, возвращающей указатель на тип har. Функция c находит в строке Пример //описание функ ции, возвращающей указатель на тип har. Функция c находит в строке первый пробел и возвращает его адрес. char *find(char *string) { int i=0; while ((string[i]!=' ')&&(string[i] !='')) i++; if (string[i]) return &string[i]; // возвращает адрес первого пробела else return NULL; // возврат нулевого указателя }

Функции • Когда функция не возвращает никакого значения, она должна быть описана как функция Функции • Когда функция не возвращает никакого значения, она должна быть описана как функция типа void (пустая). • Если не объявлять функцию типа void, тогда она по умолчанию будет иметь тип int и не возвращать ника кого значения. то вызовет Э предупреждающее сообщение компилятора, но не будет препятствием для компиляции.

Пример //функция вывода на экран горизонтальной строки, состоящей из заданного символа void gorizontal_line(char ch) Пример //функция вывода на экран горизонтальной строки, состоящей из заданного символа void gorizontal_line(char ch) { int i; for (i=0; i<80; i++) printf (“%c”, ch); }

Прототипы функций Прототипы функций

Прототипы функций • Для создания правильного машинного кода функ ции необходимо до ее первого Прототипы функций • Для создания правильного машинного кода функ ции необходимо до ее первого вызова сообщить компиля тору тип возвращаемого результата, а также количество и типы аргументов. • Для этой цели в С++ используется понятие прототипа функции. Формат : тип <имя функции> (список параметров);

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

Прототипы функций //Пример объявления прототипа функции: int func(int a, float b, char* с); //или Прототипы функций //Пример объявления прототипа функции: int func(int a, float b, char* с); //или так: int func(int, float, char*); Два этих объявления абсолютно равносильны.

Пример #include <stdio. h> float sqr(float a); // это прототип объявление функции main() { Пример #include float sqr(float a); // это прототип объявление функции main() { float b; b=5. 2; printf ("Квадрат числа %f равен %f", b, sqr(b)); } float sqr(float a) // это описание функции { return a*a; }

Прототипы функций нужно задавать в сле дующих случаях: • функция возвращает значение типа, отличного Прототипы функций нужно задавать в сле дующих случаях: • функция возвращает значение типа, отличного от int; • указатель на функцию должен быть инициализи рован до того, как функция будет определена. Это обеспе чивается заданием прототипа функции.

Глобальные, локальные и формальные парамет ры Глобальные, локальные и формальные парамет ры

Глобальные, локальные и формальные парамет ры • Область действия переменной это правила, кото рые Глобальные, локальные и формальные парамет ры • Область действия переменной это правила, кото рые устанавливают, какие данные доступны из данного места программы. • В языке С++ каждая функция это отдельный блок программы. Попасть в тело функции нельзя иначе, как через вызов данной функции. • В частности нельзя опера тором перехода oto перейти в g середину другой функции. • С точки зрения области действия переменных раз личают три типа переменных: лобальные, г локальные и формальные параметры. Правила области действия опре деляют, где каждая из них может применяться.

Локальные переменные • Локальные переменные это переменные, объяв ленные внутри блока, в частности внутри Локальные переменные • Локальные переменные это переменные, объяв ленные внутри блока, в частности внутри функции. • Язык С++ поддерживает простое правило: переменная может быть объявлена внутри любого блока программы. • Локальная переменная доступна внутри блока, в котором она объяв лена (блок открывается фигурной скобкой и закрывается фигурной скобкой). • Область действия ло кальной переменной блок. • Локальная переменная существует пока выполня ется блок, в котором эта переменная объявлена. При вы ходе из блока эта переменная ( и ее значение) теряется.

Пример #include <stdio. h> void f(); main() { int i; i=1; f(); printf( Пример #include void f(); main() { int i; i=1; f(); printf("B функции main значение i равно %dn", i); } void f() { int i; i=10; printf("B функции f() значение i равно %dn", i); }

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

Глобальные переменные • Глобальные переменные это переменные, объяв ленные вне какой либо функции. • Глобальные переменные • Глобальные переменные это переменные, объяв ленные вне какой либо функции. • В отличие от локальных переменных глобальные переменные могут быть исполь зованы в любом месте программы, но перед их первым использованием они должны быть объявлены. • Область действия глобальной переменной вся программа.

Глобальные переменные Недостатки: • занимают память в течение всего времени работы программы; • использование Глобальные переменные Недостатки: • занимают память в течение всего времени работы программы; • использование глобальных переменных делает функции менее общими и затрудняет их использование в других программах; • использование внешних переменных дает воз можным появление рудноотыскиваемых т ошибок из за побочных явлений.

Параметры и аргументы функции Параметры и аргументы функции

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

Пример void swap(int a, int b) { int r=a; a=b; b=r; } //Функция swap() Пример void swap(int a, int b) { int r=a; a=b; b=r; } //Функция swap() не будет менять местами значения параметров.

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

Пример void swap(int *а, int *b) { int r=*a; *a=*b; *b=r; } Пример void swap(int *а, int *b) { int r=*a; *a=*b; *b=r; }

Пример #include <stdio. h> #include <locale> void swap(int a, int b); void swap 1(int Пример #include #include void swap(int a, int b); void swap 1(int *a, int *b); main() { setlocale(LC_ALL, "rus"); int x=5, y=10; printf("Сначала x=%d y=%dn", x, y); swap(x, y); printf("Teпepь x=%d y=%dn", x, y); printf("Hичero не изменилосьn"); swap 1(&x, &y); // Передаются адреса переменных printf("Teпepь x=%d y=%dn", x, y); printf("Значения поменялись"); return 0; } void swap(int a, int b) { int r=a; a=b; b=r; } void swap 1(int *a, int *b) { int r=*a; *a=*b; *b=r; }

Рекурсивные функции Рекурсивные функции

Рекурсивные функции • В языке С++ функции могут вызывать сами себя. • Функция называется Рекурсивные функции • В языке С++ функции могут вызывать сами себя. • Функция называется рекурсивной, если оператор в теле функции содержит вызов этой же функции. • Классический пример рекурсивной функции это вычисление факториа ла числа !=1*2*3*. . . *n. n • Вызов функции в рекурсивной функции не создает новую копию функции, а создает в памяти новые копии локальных переменных и параметров. • Из рекурсивной функции надо предусмотреть выход, иначе это вызовет “зависание” системы.

Пример factorial(int n) { int а; if (n==1) return 1; a=factorial(n 1)*n; return а; Пример factorial(int n) { int а; if (n==1) return 1; a=factorial(n 1)*n; return а; }