Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С_глава2.doc
Скачиваний:
1
Добавлен:
16.12.2018
Размер:
167.94 Кб
Скачать

Использование указателей при работе с функциями

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

тип (*имя_указателя)(тип_параметра, тип_параметра,…)

Пример объявления указателя на функцию, возвращающую целое число, с двумя аргументами целого и вещественного типов.

int (*pfunc)(int, float);

Инициализировать указатель на функцию можно с помощью имени функции, которое трактуется как адрес:

int func(int a){ …} // Определение функции func()

int (*pfunc)(int); // Объявление указателя на функцию

pfunc=func; // Присваивание адреса функции

Пример 1. Создать функцию, печатающую приветствие. Вызов ее осуществить через указатель.

#include <stdio.h>

int func(char *msg)

{ return printf(msg);

}

int main()

{

int (*pfunc)(char*); // Объявление указателя на функцию

pfunc=func; // Инициализация указателя

(*pfunc)(“HELLO!\n”); // Вызов функции через указатель

return 0;

}

Пример 2. Задать значения двух целых переменных. Используя соответствующую функцию, поменять значения этих переменных.

#include <stdio.h>

int swap(int *px, int *py) // px и py являются указателями

{ int temp;

temp=*px; // Переменной temp присваивается значение, на которое указывает px

*px=*py; // Теперь по адресу px находится значение y

*py=temp;

return 0;

}

int main()

{

int swap(int *px, int *py); // Прототип функции

int x=3, y=5; // Инициализация переменных x и y

printf(“Вначале значение x=%d, y=%d\n”, x,y);

swap(&x, &y); // Передача адресов переменных x и y функции swap

printf(“Теперь значение x=%d, y=%d\n”, x,y);

return 0;

}

Пояснения.

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

Перегрузка функций

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

Пример перегрузки функции.

int myFunction(int,int);

int myFunction(long,long);

int myFunction(long);

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