Указатель на массив указателей, ссылающихся на функции, как мне изменить значения указателя и вызвать функции? - PullRequest
0 голосов
/ 25 февраля 2019
int *(*(*functions_array)[4](); 
int *function() { /*code */ };

Я знаю, что с помощью указателя, ссылающегося на функцию int *(*func)();, я могу просто присвоить значение указателя функции для func func = &function;, а затем вызвать с помощью func();.

.мог бы добраться до такого поведения, но с добавлением массивов?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Во-первых, декларация, которую вы показываете, неверна.Не удивительно, учитывая, насколько сложным может быть синтаксис объявления в Си.Если вам нужен массив указателей на функции (что я сильно подозреваю), тогда необработанное написание выглядит следующим образом:

int *(*functions_array[4])();

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

functions_array[0] = function; 
functions_array[0](); // Call the function

Но если вы действительно хотели указатель на массив (по причинам, которые я не могу понять), необработанный декларатор выглядит так:

int *(*(*functions_array_p)[4])();

С теперь менеепривлекательная индексация для соответствия:

(*functions_array_p)[0] = function; 
(*functions_array_p)[0](); // Call the function

Скобки требуются из-за обычного приоритета * и [].

Но способ сделать работу с ней и определить ее проще, путем введения псевдонимов некоторых типов.Прежде всего, для типа функции:

typedef int* function_type();

Теперь объявление массива принимает эту гораздо более читаемую форму:

function_type* functions_array[4];

Звездочка в поле зрения в целом соответствует обычной практике нескрытие семантики указателя.

А для указателя на массив:

function_type* (*functions_array)[4];

Декларатор по-прежнему выглядит довольно регулярно.


1.Кроме того, пустой список параметров в объявлении функции C не означает, что функция не принимает аргументов.Это устаревшая функция, обеспечивающая функцию без прототипа.Путь вперед - (void).

0 голосов
/ 25 февраля 2019

Вы, вероятно, хотите это:

#include <stdio.h>

int function1(void)
{
  printf("function 1\n");
  return 1;
};

int function2(void)
{
  printf("function 2\n");
  return 2;
};

int(*FunctionPointer)(void);             // a function pointer
int(*ArrayOfFunctionPointers[4])(void);  // an array of 4 function pointers


int main()
{
  FunctionPointer = function1;
  FunctionPointer();                     // will call function1

  FunctionPointer = function2;
  FunctionPointer();                     // will call function2

  ArrayOfFunctionPointers[0] = function1;
  ArrayOfFunctionPointers[1] = function2;

  for (int i = 0; i < 2; i++)
  {
    ArrayOfFunctionPointers[i]();
  }
}

Вывод:

function 1
function 2
function 1
function 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...