Tindakan menyahrujuk penuding fungsi dalam C mungkin kelihatan menghasilkan hasil yang tidak dijangka. Sebagai contoh, coretan kod di bawah nampaknya melakukan bilangan penyahrujukan yang berlebihan pada penuding fungsi, tetapi output kekal tidak berubah:
#include<stdio.h> void hello() { printf("hello"); } int main(void) { (*****hello)(); }
Untuk memahami tingkah laku ini, ia perlu penting untuk menjelaskan semantik penunjuk fungsi dalam C. Walaupun nama fungsi mungkin membayangkan penunjuk kepada fungsi, ia sebenarnya mewakili alamat kod fungsi. Oleh itu, penyahrujukan penuding fungsi tidak secara langsung melaksanakan fungsi tetapi sebaliknya mengembalikan penentu fungsi, yang dengan pantas ditukar kembali kepada penuding fungsi.
Dalam kod contoh, penyahrujukan berulang hello tidak melaksanakan fungsi berulang kali. Sebaliknya, setiap dereference mencipta penunjuk fungsi baharu, yang kemudiannya ditukar kembali kepada penunjuk fungsi. Ungkapan akhir (*****hello) hanya menilai kepada penuding fungsi untuk hello, dan memanggilnya melalui () melaksanakan fungsi seperti yang diharapkan.
Satu lagi pelik aspek penunjuk fungsi dalam C ialah penukaran tersiratnya antara nilai fungsi dan penunjuk dalam konteks tertentu. Apabila nilai fungsi muncul dalam konteks rnilai (sebarang konteks yang digunakan sebagai nilai dan bukannya lokasi), ia ditukar secara automatik kepada penuding fungsi. Tingkah laku ini meluas kepada nilai fungsi bersarang, di mana setiap penyahrujukan mengembalikan penuding fungsi yang menunjuk kepada fungsi asal.
Walaupun tingkah laku penyahrujukan penuding fungsi pada mulanya kelihatan membingungkan, ia boleh menjadi bermanfaat dalam senario tertentu. Dengan mengelakkan penggunaan eksplisit & apabila menghantar penunjuk fungsi, kod menjadi lebih ringkas dan boleh dibaca. Selain itu, simetri antara fungsi panggilan melalui kedua-dua penunjuk fungsi dan nama fungsi membolehkan peralihan yang lancar antara kedua-dua bentuk.
Atas ialah kandungan terperinci Mengapa Penyahrujukan Berulang Penunjuk Fungsi dalam C Tidak Membawa kepada Panggilan Berbilang Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!