Tüm bu operatör kombinasyonlarının aynı şekilde çalışmasına izin veren birkaç parça var.
Tüm bu çalışmaların neden bir fonksiyonun (gibi foo
) dolaylı olarak fonksiyonun bir göstergesine dönüştürülebilir olmasıdır. Bu yüzden void (*p1_foo)() = foo;
çalışır: foo
dolaylı olarak kendisine bir işaretçiye dönüştürülür ve bu işaretçiye atanır p1_foo
.
Tekli &
, bir işleve uygulandığında, bir nesneye uygulandığında bir nesnenin adresini verdiği gibi, işleve bir işaretçi verir. Sıradan işlevlere işaretçiler için, örtük işlevden işleve işaretçi dönüşümü nedeniyle her zaman gereksizdir. Her durumda, bu yüzden void (*p3_foo)() = &foo;
çalışıyor.
Tekli *
, bir işlev işaretçisine uygulandığında, tıpkı bir nesneye normal bir işaretçiye uygulandığında sivri uçlu nesneye verdiği gibi, sivri uçlu işlevi verir.
Bu kurallar birleştirilebilir. Sondan ikinci örneğe bakalım **foo
:
- Birincisi,
foo
dolaylı olarak kendisine bir işaretçiye dönüştürülür ve birincisi *
bu işlev işaretçisine uygulanır ve işlevi foo
yeniden verir.
- Daha sonra, sonuç tekrar örtük olarak kendisine bir göstergeye dönüştürülür ve ikincisi
*
uygulanır, yine işlevi verir foo
.
- Daha sonra, dolaylı olarak tekrar bir işlev işaretçisine dönüştürülür ve değişkene atanır.
İstediğiniz kadar ekleyebilirsiniz *
, sonuç her zaman aynıdır. Daha fazla *
, daha iyi .
Beşinci örneğinizi de düşünebiliriz &*foo
:
- İlk olarak,
foo
örtük olarak kendisine bir işaretçi haline dönüştürülür; unary tekrar *
uygulanır foo
.
- Daha sonra, değişkene atanan bir işaretçi vererek
&
uygulanır .foo
foo
&
Sadece, olmasa da (bir işlev işaretçisi dönüştürülmüş bir işleve bağlı uygulanabilir tabii ki, işlev işaretçisi sonucu işaretçi-a-pointer- bu durumda bir değişken olup, sürece örneğin, listenize ekleyebilirsiniz void (**pp_foo)() = &p7_foo;
).
Bu yüzden &&foo
çalışmıyor: &foo
bir işlev değil; bir değer olan bir işlev işaretleyicisidir. Bununla birlikte, &*&*&*&*&*&*foo
olduğu gibi, çalışmak &******&foo
için bu ifadelerin hem de, &
her zaman bir işleve değil, bir rvalue işlev işaretçisi uygulanır.
Ayrıca *
işlev işaretçisi aracılığıyla arama yapmak için tekli telefon kullanmanız gerekmediğini unutmayın ; hem (*p1_foo)();
ve (p1_foo)();
yine nedeniyle fonksiyon için fonksiyonlu işaretçisi dönüşüm, aynı sonucu vardır.
&foo
adresinin beklendiği gibifoo
işaret ettiği bir işlev işaretçisi ile sonuçlanırfoo
.