"সর্পিল" নিয়মের ধরণের ধরণের নিম্নলিখিত অগ্রাধিকার নিয়মের বাইরে পড়ে:
T *a[] -- a is an array of pointer to T
T (*a)[] -- a is a pointer to an array of T
T *f() -- f is a function returning a pointer to T
T (*f)() -- f is a pointer to a function returning T
সাবস্ক্রিপ্ট []
এবং ফাংশন কল ()
অপারেটরগুলির অ্যানারি থেকে উচ্চতর অগ্রাধিকার রয়েছে *
, তাই *f()
পার্স করা হয় *(f())
এবং *a[]
হিসাবে পার্স করা হয় *(a[])
।
সুতরাং আপনি যদি কোনও অ্যারেতে কোনও পয়েন্টার বা কোনও ফাংশনে একটি পয়েন্টার চান, তবে আপনাকে স্পষ্টতই *
শনাক্তকারীটির সাথে গোষ্ঠীটি তৈরি করতে হবে , যেমন (*a)[]
বা হিসাবে (*f)()
।
তারপরে আপনি এটি উপলব্ধি করতে পারেন a
এবং f
কেবল সনাক্তকারীদের চেয়ে আরও জটিল অভিব্যক্তি হতে পারে; মধ্যে T (*a)[N]
, a
একটি সহজ শনাক্তকারী হতে পারে, অথবা এটি মত একটি ফাংশন কল হতে পারে (*f())[N]
( a
-> f()
), অথবা এটা পছন্দ একটি অ্যারের হতে পারে (*p[M])[N]
, ( a
-> p[M]
), অথবা এটা পছন্দ ফাংশন পয়েন্টার একটি অ্যারের হতে পারে (*(*p[M])())[N]
( a
-> (*p[M])()
), প্রভৃতি
*
ইন্ডিয়ারেশন অপারেটরটি আনারির পরিবর্তে পোস্টফিক্স হলে এটি দুর্দান্ত হবে , যা বাম থেকে ডানদিকে ডিক্লোরেশনগুলি কিছুটা সহজ করে দেবে ( void f[]*()*();
স্পষ্টতই এর চেয়ে ভাল প্রবাহিত হবে void (*(*f[])())()
), তবে তা নয়।
আপনি যখন এর মতো লোমশ ঘোষণার মুখোমুখি হন, তখন বাম দিকের সনাক্তকারী সনাক্ত করে শুরু করুন এবং উপরের অগ্রাধিকার নিয়মগুলি প্রয়োগ করুন, এগুলি কোনও ক্রিয়াকলাপের পরামিতিতে পুনরাবৃত্তভাবে প্রয়োগ করুন:
f -- f
f[] -- is an array
*f[] -- of pointers ([] has higher precedence than *)
(*f[])() -- to functions
*(*f[])() -- returning pointers
(*(*f[])())() -- to functions
void (*(*f[])())(); -- returning void
signal
মান লাইব্রেরিতে ফাংশন সম্ভবত বাতুলতা এই ধরনের টাইপ নমুনা হল:
signal -- signal
signal( ) -- is a function with parameters
signal( sig, ) -- sig
signal(int sig, ) -- which is an int and
signal(int sig, func ) -- func
signal(int sig, *func ) -- which is a pointer
signal(int sig, (*func)(int)) -- to a function taking an int
signal(int sig, void (*func)(int)) -- returning void
*signal(int sig, void (*func)(int)) -- returning a pointer
(*signal(int sig, void (*func)(int)))(int) -- to a function taking an int
void (*signal(int sig, void (*func)(int)))(int); -- and returning void
এই মুহুর্তে বেশিরভাগ লোক "টাইপডিফ ব্যবহার করুন" বলে, যা অবশ্যই একটি বিকল্প:
typedef void outerfunc(void);
typedef outerfunc *innerfunc(void);
innerfunc *f[N];
কিন্তু ...
আপনি কীভাবে একটি অভিব্যক্তিতে ব্যবহার করবেন f
? আপনি জানেন যে এটি পয়েন্টারগুলির একটি অ্যারে, তবে আপনি সঠিক ফাংশনটি সম্পাদন করতে এটি কীভাবে ব্যবহার করবেন? আপনাকে টাইপডেফগুলি দেখতে হবে এবং সঠিক বাক্য গঠনটি ধাঁধা দিতে হবে। বিপরীতে, "নগ্ন" সংস্করণটি বেশ আইস্ট্যাবাই, তবে এটি আপনাকে ঠিক কীভাবে কোনও এক্সপ্রেশনে ব্যবহার করবেন তা বলে দেয় f
(যথা (*(*f[i])())();
, ধরে নেওয়া যায় না যে দুটি ফাংশনই আর্গুমেন্ট নেয় না)।