Функция Указатель - Автоматическое разыменование

Возможный дубликат:
Как происходит разыменование указателя функции?

  void myprint(char* x) {
      printf("%s\n", x); 
  }

  int main() {
     char* s = "hello";
     void (*test)(char*);
     void (*test2)(char*);

     test = myprint;
     test2 = &myprint;

     test(s);
     (*test)(s);
     test2(s);
     (*test2)(s);

  }

Может кто-нибудь объяснить мне, почему весь приведенный выше код действителен? "Привет" печатается четыре раза. Применяя указатель на функцию, неявно ли она защищена? В принципе, я хочу знать, как на самом деле хранятся указатели на функции, потому что выше это путает.

Ответы

Ответ 1

Это просто причуда C. Нет другой причины, но стандарт C просто говорит о том, что разыменование или принятие адреса функции просто оценивает указатель на эту функцию, а разыменование указателя функции просто возвращает обратно к функции указатель.

Это поведение (очевидно, очевидно) сильно отличается от того, как работают унарные операторы & и * для нормальных переменных.

Итак,

test2 = myprint;
test2 = &myprint;
test2 = *myprint;
test2 = **********myprint;

Все просто делают то же самое, дает вам указатель на myprint

Аналогично,

test2(s);
(*test2)(s);
(***********test2)(s);

То же самое, вызовите указатель функции, сохраненный в test2. Потому что C говорит, что делает.