Правильный способ использования указателя функции [duplicate]

убедитесь, что вы действительно загрузите jquery, это не jquery - это ui!

  <script language="JavaScript" 
    src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js">
  </script>

Это правильный источник скрипта для jquery:

 <script language="JavaScript"  src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
189
задан Lundin 13 April 2016 в 12:50
поделиться

2 ответа

Есть несколько частей, которые позволяют всем этим комбинациям операторов работать одинаково.

Основная причина, по которой все эти работы заключаются в том, что функция (например, foo) является неявно конвертируемый в указатель на функцию. Вот почему void (*p1_foo)() = foo; работает: foo неявно преобразуется в указатель на себя и этот указатель присваивается p1_foo.

Унарный & при применении к функции дает указатель на функцию, так же, как он дает адрес объекта, когда он применяется к объекту. Для указателей на обычные функции он всегда избыточен из-за неявного преобразования функции-функции-указателя. В любом случае, поэтому void (*p3_foo)() = &foo; работает.

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

Эти правила могут быть объединены. Рассмотрим ваш второй, последний пример, **foo:

  • Во-первых, foo неявно преобразуется в указатель на себя, а первый * применяется к этому указателю функции, что дает функцию foo снова.
  • Затем результат снова неявно преобразуется в указатель на себя, а второй * применяется, снова приводя к функции foo.
  • It затем неявно преобразуется в указатель функции и присваивается переменной.

Вы можете добавить столько * s, сколько хотите, результат всегда один и тот же. Чем больше * s, тем веселее.

Мы также можем рассмотреть ваш пятый пример, &*foo:

  • Во-первых, foo неявно преобразуется в указатель для себя; применяется унарный *, снова получая foo.
  • Затем к foo применяется &, что дает указатель на foo, который присваивается переменной.

& может применяться только к функции, но не к функции, которая была преобразована в указатель функции (если, конечно, указатель функции не является переменной, в которой Если результатом является указатель на указатель на функцию, например, вы можете добавить в свой список void (**pp_foo)() = &p7_foo;).

Вот почему &&foo не работает : &foo не является функцией; это указатель на функцию, являющийся значением r. Однако &*&*&*&*&*&*foo будет работать, как и &******&foo, поскольку в обоих этих выражениях & всегда применяется к функции, а не к указателю функции rvalue.

Обратите внимание, что вы также не нужно использовать унарный * для совершения вызова с помощью указателя функции; оба (*p1_foo)(); и (p1_foo)(); имеют тот же результат, опять же из-за преобразования функции-функции-указателя.

200
ответ дан James McNellis 26 August 2018 в 09:11
поделиться

Я думаю, что также полезно помнить, что C - это просто абстракция для базовой машины, и это одно из мест, где эта абстракция протекает.

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

6
ответ дан madumlao 26 August 2018 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: