Есть несколько частей, которые позволяют всем этим комбинациям операторов работать одинаково.
Основная причина, по которой все эти работы заключаются в том, что функция (например, 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)();
имеют тот же результат, опять же из-за преобразования функции-функции-указателя.
Ради полноты я повторю обсуждение сообщения Reto в Android Groups здесь .
кажется, что при установке границ на drawable это добивается цели:
Drawable defaultMarker = r.getDrawable(R.drawable.icon);
// You HAVE to specify the bounds! It seems like the markers are drawn
// through Drawable.draw(Canvas) and therefore must have its bounds set
// before drawing.
defaultMarker.setBounds(0, 0, defaultMarker.getIntrinsicWidth(),
defaultMarker.getIntrinsicHeight());
MyItemizedOverlay markers = new MyItemizedOverlay(defaultMarker);
overlays.add(markers);
Между прочим, вышеупомянутое бесстыдно разорвано от демонстрация в MarcelP.info. Кроме того, вот хорошее практическое руководство .