убедитесь, что вы действительно загрузите 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>
Есть несколько частей, которые позволяют всем этим комбинациям операторов работать одинаково.
Основная причина, по которой все эти работы заключаются в том, что функция (например, foo
) является неявно конвертируемый в указатель на функцию. Вот почему void (*p1_foo)() = foo;
работает: foo
неявно преобразуется в указатель на себя и этот указатель присваивается p1_foo
.
Унарный &
при применении к функции дает указатель на функцию, так же, как он дает адрес объекта, когда он применяется к объекту. Для указателей на обычные функции он всегда избыточен из-за неявного преобразования функции-функции-указателя. В любом случае, поэтому void (*p3_foo)() = &foo;
работает.
Унарный *
, применяемый к указателю на функцию, дает функцию с указателем, точно так же, как он дает объект, указывающий на объект, когда он применяется к обычным указателям на объект.
Эти правила могут быть объединены. Рассмотрим ваш второй, последний пример, **foo
:
foo
неявно преобразуется в указатель на себя, а первый *
применяется к этому указателю функции, что дает функцию foo
снова. *
применяется, снова приводя к функции foo
. Вы можете добавить столько *
s, сколько хотите, результат всегда один и тот же. Чем больше *
s, тем веселее.
Мы также можем рассмотреть ваш пятый пример, &*foo
:
foo
неявно преобразуется в указатель для себя; применяется унарный *
, снова получая foo
. foo
применяется &
, что дает указатель на foo
, который присваивается переменной. &
может применяться только к функции, но не к функции, которая была преобразована в указатель функции (если, конечно, указатель функции не является переменной, в которой Если результатом является указатель на указатель на функцию, например, вы можете добавить в свой список void (**pp_foo)() = &p7_foo;
).
Вот почему &&foo
не работает : &foo
не является функцией; это указатель на функцию, являющийся значением r. Однако &*&*&*&*&*&*foo
будет работать, как и &******&foo
, поскольку в обоих этих выражениях &
всегда применяется к функции, а не к указателю функции rvalue.
Обратите внимание, что вы также не нужно использовать унарный *
для совершения вызова с помощью указателя функции; оба (*p1_foo)();
и (p1_foo)();
имеют тот же результат, опять же из-за преобразования функции-функции-указателя.
Я думаю, что также полезно помнить, что C - это просто абстракция для базовой машины, и это одно из мест, где эта абстракция протекает.
С точки зрения компьютера функция просто адрес памяти, который, если выполняется, выполняет другие инструкции. Таким образом, функция в C сама моделируется как адрес, что, вероятно, приводит к тому, что функция «то же самое», что и адрес, на который он указывает.