এতে কয়েকটি টুকরো রয়েছে যা অপারেটরগুলির এই সমস্ত সংমিশ্রণকে একইভাবে কাজ করতে দেয়।
এই সমস্ত কাজ করার মূল কারণটি হ'ল কোনও ফাংশন (লাইক foo
) স্পষ্টভাবে ফাংশনের পয়েন্টারে রূপান্তরিত হয়। এই কারণেই void (*p1_foo)() = foo;
কাজ করে: foo
সুস্পষ্টভাবে নিজেকে একটি পয়েন্টারে রূপান্তরিত হয় এবং সেই পয়েন্টারটি নির্ধারিত হয় p1_foo
।
অ্যানারি &
, যখন কোনও ফাংশনে প্রয়োগ করা হয়, তখন ফাংশনে একটি পয়েন্টার পাওয়া যায়, ঠিক যেমন এটি যখন কোনও বস্তুর সাথে প্রয়োগ করা হয় তখন কোনও বস্তুর ঠিকানা দেয়। সাধারণ ফাংশনগুলিতে পয়েন্টারগুলির জন্য, অন্তর্নিহিত ফাংশন-থেকে-ফাংশন-পয়েন্টার রূপান্তর কারণে এটি সর্বদা অপ্রয়োজনীয়। যে কোনও ক্ষেত্রে, এই কারণেই void (*p3_foo)() = &foo;
কাজ করে।
অ্যানারি *
, যখন কোনও ফাংশন পয়েন্টারে প্রয়োগ করা হয়, ঠিক একইভাবে পয়েন্ট-টু ফাংশন দেয়, যখন এটি কোনও বস্তুতে একটি সাধারণ পয়েন্টারের সাথে প্রয়োগ করা হয় তখন পয়েন্ট-টু অবজেক্টটি দেয়।
এই নিয়ম একত্রিত করা যেতে পারে। আপনার দ্বিতীয় থেকে শেষ উদাহরণ বিবেচনা করুন **foo
:
- প্রথমত,
foo
স্পষ্টভাবে নিজেই একটি পয়েন্টারে রূপান্তরিত হয় এবং প্রথমটি *
ফাংশন পয়েন্টারটিতে প্রয়োগ করা হয়, foo
আবার ফাংশনটি প্রদান করে ।
- তারপরে, ফলাফলটি আবারও স্পষ্টভাবে নিজের মধ্যে পয়েন্টারে রূপান্তরিত হয় এবং দ্বিতীয়টি
*
প্রয়োগ করা হয়, আবার ফাংশনটি প্রদান করে foo
।
- এরপরে এটি স্পষ্টতই আবার একটি ফাংশন পয়েন্টারে রূপান্তরিত হয় এবং ভেরিয়েবলকে বরাদ্দ করা হয়।
আপনি *
যতটা পছন্দ যোগ করতে পারেন ফলাফল সর্বদা এক রকম হয়। আরও বেশি *
, ম্যারিয়ার।
আমরা আপনার পঞ্চম উদাহরণটিও বিবেচনা করতে পারি &*foo
,:
- প্রথমত,
foo
স্পষ্টতই নিজেকে পয়েন্টারে রূপান্তরিত করা হয়; unary *
প্রয়োগ করা হয়, foo
আবার ফলন ।
- তারপরে,
&
প্রয়োগ করা হয় foo
, এটির জন্য একটি পয়েন্টার পাওয়া যায় foo
, যা ভেরিয়েবলকে বরাদ্দ করা হয়।
&
শুধুমাত্র যদিও, একটি ফাংশন যে একটা ফাংশন পয়েন্টার রূপান্তরিত করা হয়েছে (না একটি ফাংশন প্রয়োগ করা যেতে পারে, যদি না, অবশ্যই, ফাংশন পয়েন্টার একটি পরিবর্তনশীল, যে ক্ষেত্রে এর ফলে পয়েন্টার-টু-এ-pointer- হয় টু-এ-ফাংশন; উদাহরণস্বরূপ, আপনি আপনার তালিকায় যুক্ত করতে পারেন void (**pp_foo)() = &p7_foo;
)।
এই কারণেই &&foo
কাজ করে না: &foo
কোনও ফাংশন নয়; এটি একটি ফাংশন পয়েন্টার যা একটি মূল্য। যাইহোক, &*&*&*&*&*&*foo
হিসাবে কাজ করবে &******&foo
, কারণ এই উভয় এক্সপ্রেশন মধ্যে &
সর্বদা একটি ফাংশন প্রয়োগ করা হয় এবং কোন মূল্য ফাংশন পয়েন্টার না।
এছাড়াও নোট *
করুন যে ফাংশন পয়েন্টারটির মাধ্যমে আপনার কলটি করতে আনারি ব্যবহার করার দরকার নেই ; উভয় (*p1_foo)();
এবং (p1_foo)();
আবার ফাংশন-টু-ফাংশন-পয়েন্টার রূপান্তর কারণে একই ফলাফল আছে।
&foo
ঠিকানা গ্রহণ করেfoo
, যার ফলস্বরূপ কোনও ফাংশন পয়েন্টারটি নির্দেশ করেfoo
, যেমনটি প্রত্যাশা করে।