|
|||
Пример 1.. Пример 2.Пример 1.
Пример 2.
//Операции над указателями #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]){ int a, c, b; int *ca, *cb; int *sa, *sb, *sc; cout << "a = "; cin >> a; cout << "b = "; cin >> b; c = a + b; sb = &b;//инициализация указателей через взятие адреса sa = &a; sc = &c; //присваивание указателю значения выражения *sc = c + a - b; ca = sa;//присваивание указателю значения другого указателя cb = sb; *sa = 12;//присваивание указателю значения константы cout << "\n*ca = " << *ca; cout << "\n*sa = " << *sa; cout << "\n*cb = " << *cb; cout << "\n*sb = " << *sb; cout << "\n*sc = " << *sc; cout << "\nca = " << ca; cout << "\ncb = " << cb; cout << "\nsc = " << sc; cout << "\na = " << a; cout << "\nb = " << b; cout << "\nc = " << c; cout << "\n&a = " << &a; cout << "\n&b = " << &b; cout << "\n&c = " << &c; cout << "\n*&a = " << *&a; cout << "\n*cb-*ca = " << *cb - *ca; cout << "\n*cb+*ca = " << *cb + *ca; *cb += 2; //сложение с константой cout << "\ncb = " << cb; cb++; //инкремент cout << "\ncb = " << cb; ca--; //декремент cout << "\ncа = " << ca; cout << "\ncb-ca = " << cb - ca << endl; system("pause"); return 0; }
2. Указатель на функцию Указатель на функцию – переменная, которая содержит адрес некоторой функции. Соответственно, косвенное обращение по этому указателю представляет собой вызов функции. Синтаксис определения указателя на функцию: тип_функции(*имя_указателя)(спецификация_параметров) где тип_функции – определяет тип возвращаемого функцией значения; имя_указателя – идентификатор; спецификация_параметров – определяет состав и типы параметров функции. Например: int (*pf)(); // без контроля параметров вызова int (*pf)(void); // без параметров, с контролем по прототипу int (*pf)(int, char*); // с контролем по прототипу В соответствии с принципом контекстного определения типа данных эту конструкцию следует понимать так: pf – переменная, при косвенном обращении к которой вызывается функция с соответствующим прототипом, например int_F(int, char*), то есть pf содержит адрес функции или указатель на функцию. Следует обратить внимание на то, что в определении указателя присутствует прототип – указатель ссылается не на произвольную функцию, а только на одну из функций с заданной схемой формальных параметров и результата. В определении указателя количество и тип параметров должны совпадать с соответствующими типами в определении функции, на которую ставится указатель. Например, int (*func1Prt)(char); задает определение указателя func1Prt на функцию с параметром типа char, возвращающую значение типа int. Важнейшим элементом в определении указателя на функцию являются круглые скобки. Так следующий фрагмент: int *func(char); это не определение указателя, а объявление (прототип) функции c именем func и параметром типа char, возвращающей значение указателя типа int *. В этом случае указатель указывает на значение функции. Если же выполнить объявление: char *(*func2Prt)(char *,int); то определение указателя func2Prt на функцию с параметрами типа указатель на char и типа int, возвращающую значение типа указатель на char. Синтаксис вызова функции с помощью указателя: (*имя_указателя)(список_фактических_параметров); значением имя_указателя служит адрес функции, а с помощью операции разыменования * обеспечивается обращение по адресу к этой функции. Арифметические операции над указателями на функции запрещены. Указатели на функции в основном используются в следующих случаях. · Многие библиотечные функции в качестве аргумента получают указатель на функцию. Например, функция сортировки qsort() получает четвертым аргументом указатель на составляемую пользователем функцию сравнения сортируемых элементов. · Использование указателей на функции в качестве аргументов позволяет разрабатывать универсальные функции, реализующие известные алгоритмы или методы. Например, функции численного решения уравнений, интегрирования и дифференцирования. · Указатели на функции могут использоваться для косвенного вызова резидентных программ, точка входа в которые записана в известное место памяти, например, по одному из неиспользуемых векторов прерываний. В определении указателя на функцию тип возвращаемого значения, а также типы, количество, последовательность параметров должны совпадать с соответствующими типами и характеристиками параметров тех функций, адреса которых предполагается присваивать вводимому указателю при инициализации или с помощью оператора присваивания.
|
|||
|