1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <iostream> using std::cout; using std::cin; void a(){ cout << "foo1\n"; } void b(){ cout << "foo2\n"; } void c(){ cout << "foo3\n"; } int main(){ void ((*arr[3]))(); //Создали массив с 3 ячейками под функции /*В любую ячейку в нужный момент можно присвоить адрес функции*/ arr[0] = a; arr[1] = b; arr[2] = c; /*И использовать ячейку, хранящую адрес функции, как функцию*/ for (int i=0; i<3; i++){ arr[i](); //с помощью указательной переменной запускаем функцию } cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//Только для void (const char*) #include <iostream> using std::cout; using std::cin; void foo1(const char* S){ cout << "foo1: " << S << '\n'; } void foo2(const char* S){ cout << "foo2: " << S << '\n'; } void foo3(const char* S){ cout << "foo3: " << S << '\n'; } int main(){ void ((*arr[3]))(const char*); //Создали массив с 3 ячейками под функции /*В любую ячейку в нужный момент можно присвоить адрес функции*/ arr[0] = foo3; arr[1] = foo1; arr[2] = foo2; /*И использовать ячейку, хранящую адрес функции, как функцию*/ arr[0]("HELLO"); //с помощью указательной переменной запускаем функцию arr[1]("World"); arr[2]("GRAND!!!"); cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//Только для int (int) #include <iostream> using std::cout; using std::cin; int foo1(int value){ return value + 5; } int foo2(int value){ return value + 10; } int foo3(int value){ return value + 25; } int main(){ int ((*arr[3]))(int); //Создали массив с 3 ячейками под функции /*В любую ячейку в нужный момент можно присвоить адрес функции*/ arr[0] = foo3; arr[1] = foo1; arr[2] = foo2; /*И использовать ячейку, хранящую адрес функции, как функцию*/ cout << arr[0](10) << '\n'; //с помощью указательной переменной запускаем функцию cout << arr[1](10) << '\n'; cout << arr[2](10) << '\n'; cin.get(); } |
Смотрим на 15-ю строчку кода. Там мы вытаскиваем значение из массива и использованием круглых скобок задействуем вытащенное значение как функцию. Не забываем, что индексация массивов начинается с нуля, и поэтому то, что мы пишем 2 в квадратных скобках в месте обращения к ячейке массива — будет обозначать третий индекс массива. (0,1,2) — двойка на третьей позиции. Так как в массиве расположены не самые обычные значения, а адреса функций, то и обращаемся мы к значениям не как к обычным значениям, а как к функциям, после чего и происходит вызов той функции, к которой мы обратились задействовав указатель, хранящийся в массиве.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
//Листинг #4 C++ массив указателей на возвращающие указатели на указатели функции //Только для void (const char*) #include <iostream> using std::cout; using std::cin; /* ОДНОТИПНЫЕ ФУНКЦИИ, ВОЗВРАЩАЮЩИЕ int** */ int** a(const int value){ int **ptr=new int*[1]; *ptr = new int(value); return ptr; } int** b(const int value){ int **ptr=new int*[1]; *ptr = new int(value); return ptr; } int** c(const int value){ int **ptr=new int*[1]; *ptr = new int(value); return ptr; } int main() { int** (*arr[3])(const int) = {a,b,c}; //объявляем массив функций, возвращающих указатель на указатель int **f1 = arr[0](10); //В момент вызова функции запоминаем возвращаемый функцией адрес, чтобы потом этот адрес использовать для чистки памяти int **f2 = arr[1](20); //В квадратных скобках индекс массива, в круглых аргумент, передаваемый в функцию int **f3 = arr[2](30); cout << "f1 == " << **f1 << '\n'; //можно было бы cout << arr[0](10), но был бы потерян адрес, потому через вспомогтельный указатель cout << "f2 == " << **f2 << '\n'; cout << "f3 == " << **f3 << '\n'; delete *f1; //Сначала удаляем содержимое (оно выделялось как new, поэтому удаляем как немассив delete []f1; //Только потом основной указатель (он выделялся как new[1], поэтому удаляется как массив delete *f2; delete f2; delete *f3; delete f3; cin.get(); } |
А каким образом аргумент передавать в функцию???
Все функции внутри массива должны быть определены с одинаковыми аргументами.
Да, забыть что в месте запуска функций мы используем круглые скобки — это жирный баг) всегда помните об этом))
Первый пример совсем не соберётся, т.к. функции названы не верно
Последний пример — в строке 15 — непонятно, зачем разыменовывать звёздочкой, если взятие элемента по номеру [2] — его разыменует и получим указатель.
Благодарю. Исправил.