มีเพียงไม่กี่ชิ้นเท่านั้นที่ทำให้ชุดค่าผสมทั้งหมดเหล่านี้ทำงานเหมือนกัน
เหตุผลพื้นฐานว่าทำไมงานเหล่านี้ทั้งหมดคือฟังก์ชัน (เช่นfoo) สามารถแปลงเป็นตัวชี้ไปยังฟังก์ชันโดยปริยาย นี่คือเหตุผลที่void (*p1_foo)() = foo;ผลงาน: จะถูกแปลงโดยปริยายเข้าไปในตัวชี้ไปที่ตัวเองและตัวชี้ที่กำหนดให้foop1_foo
unary &เมื่อนำไปใช้กับฟังก์ชั่นจะให้ตัวชี้ไปยังฟังก์ชันเช่นเดียวกับที่มันให้ที่อยู่ของวัตถุเมื่อนำไปใช้กับวัตถุ สำหรับพอยน์เตอร์ไปยังฟังก์ชั่นทั่วไปมันจะซ้ำซ้อนเสมอเนื่องจากการแปลงฟังก์ชันไปเป็นฟังก์ชั่นตัวชี้โดยนัย ในกรณีใด ๆ นี่คือเหตุผลที่void (*p3_foo)() = &foo;ทำงาน
unary *เมื่อนำไปใช้กับตัวชี้ฟังก์ชั่นให้ผลตอบแทนฟังก์ชั่นชี้ไปที่เช่นเดียวกับมันให้ผลผลิตวัตถุชี้ไปที่เมื่อมันถูกนำไปใช้กับตัวชี้ธรรมดาไปยังวัตถุ
กฎเหล่านี้สามารถรวมกันได้ ลองพิจารณาตัวอย่างที่สองถึงล่าสุดของคุณ**foo:
- อันดับแรก
fooจะถูกแปลงเป็นตัวชี้ไปยังตัวเองโดยปริยายและตัวแรก*จะถูกนำไปใช้กับตัวชี้ฟังก์ชั่นนั้นโดยยอมให้ฟังก์ชั่นfooอีกครั้ง
- แล้วผลที่ตามมาเป็นอีกครั้งโดยปริยายแปลงเป็นตัวชี้ไปที่ตัวเองและครั้งที่สองถูกนำไปใช้อีกครั้งยอมฟังก์ชั่น
*foo
- จากนั้นจะถูกแปลงเป็นตัวชี้ฟังก์ชันอีกครั้งโดยปริยายและกำหนดให้กับตัวแปร
คุณสามารถเพิ่มได้มาก*เท่าที่คุณต้องการผลลัพธ์จะเหมือนเดิมเสมอ ยิ่ง*s, merrier
เราสามารถพิจารณาตัวอย่างที่ห้าของคุณ&*foo:
- ก่อน
fooจะถูกแปลงเป็นตัวชี้ไปยังตัวเองโดยปริยาย *จะนำมาใช้กับ unary และให้ผลfooอีกครั้ง
- จากนั้น
&จะนำไปใช้fooโดยยอมให้ตัวชี้ไปยังfooซึ่งถูกกำหนดให้กับตัวแปร
&เท่านั้นที่สามารถนำไปใช้กับการทำงานแม้ว่าจะไม่ฟังก์ชั่นที่ได้รับการแปลงเป็นตัวชี้ฟังก์ชั่น (เว้นแต่ของหลักสูตรตัวชี้ฟังก์ชั่นเป็นตัวแปรซึ่งในกรณีนี้ผลที่ได้คือตัวชี้ไป-a-pointer- to-a-function ตัวอย่างเช่นคุณสามารถเพิ่มในรายการของคุณvoid (**pp_foo)() = &p7_foo;)
นี่คือเหตุผลที่&&fooไม่ทำงาน: &fooไม่ใช่ฟังก์ชั่น; มันเป็นตัวชี้ฟังก์ชั่นที่เป็น rvalue อย่างไรก็ตาม&*&*&*&*&*&*fooจะได้ผลเหมือน&******&fooกันเพราะในทั้งสองนิพจน์&นั้นจะใช้กับฟังก์ชันเสมอและไม่ใช้กับตัวชี้ฟังก์ชัน rvalue
โปรดทราบว่าคุณไม่จำเป็นต้องใช้เอกภาพ*เพื่อทำการโทรผ่านตัวชี้ฟังก์ชั่น ทั้งสอง(*p1_foo)();และ(p1_foo)();มีผลลัพธ์เหมือนกันอีกครั้งเนื่องจากการแปลงฟังก์ชันเป็นตัวชี้ฟังก์ชัน
&fooใช้ที่อยู่ของfooซึ่งส่งผลให้ตัวชี้ฟังก์ชั่นชี้ไปที่fooอย่างที่คาดหวัง