আমি সি প্রোগ্রামিং শুরুর দিকে পয়েন্টারগুলি ব্যাখ্যা করতে সাম্প্রতিক আনন্দ পেয়েছি এবং নিম্নলিখিত অসুবিধায় হোঁচট খেয়েছি। এটি ইতিমধ্যে পয়েন্টারগুলি কীভাবে ব্যবহার করতে হয় তা যদি আপনি ইতিমধ্যে জানেন তবে এটি একটি সমস্যার মতো মনে হচ্ছে না তবে পরিষ্কার উদাহরণ দিয়ে নিম্নলিখিত উদাহরণটি দেখার চেষ্টা করুন:
int foo = 1;
int *bar = &foo;
printf("%p\n", (void *)&foo);
printf("%i\n", *bar);
পরম শুরুর দিকে আউটপুটটি আশ্চর্যজনক হতে পারে। লাইন ২-তে তিনি কেবলমাত্র * বারটিকে & foo বলে ঘোষণা করেছিলেন, তবে ৪ নং লাইনে দেখা যাচ্ছে যে * বারটি আসলে & foo এর পরিবর্তে foo!
বিভ্রান্তি, আপনি বলতে পারেন, * চিহ্নের অস্পষ্টতা থেকে উদ্ভূত: লাইন 2 এ এটি একটি পয়েন্টার ঘোষণার জন্য ব্যবহৃত হয়। লাইন 4 এ এটি অ্যানারি অপারেটর হিসাবে ব্যবহৃত হয় যা পয়েন্টার পয়েন্টের মান আনবে। দুটি ভিন্ন জিনিস, তাই না?
তবে এই "ব্যাখ্যা" কোনও শিক্ষানবিশকে মোটেই সহায়তা করে না doesn't এটি একটি সূক্ষ্ম ভিন্নতা নির্দেশ করে একটি নতুন ধারণা প্রবর্তন করে। এটি এটি শেখানোর সঠিক উপায় হতে পারে না।
তো, কীভাবে কর্নিগান এবং রিচি এটি ব্যাখ্যা করলেন?
অ্যানারি অপারেটর * ইন্ডিয়ারেশন বা ডেরেফারেন্সিং অপারেটর; যখন কোনও পয়েন্টারটিতে প্রয়োগ করা হয়, এটি পয়েন্টারটি নির্দেশিত বস্তুটি অ্যাক্সেস করে। [...]
পয়েন্টার আইপি এর ঘোষণাপত্রটি
int *ip
স্মৃতিবিজড়িত হিসাবে চিহ্নিত; এটি বলে যে অভিব্যক্তিটি*ip
একটি অন্তর্নিহিত। একটি চলকটির জন্য ঘোষণার বাক্য গঠনটি ভেরিয়েবল প্রদর্শিত হতে পারে এমন বাক্যগুলির সিনট্যাক্সটিকে নকল করে ।
int *ip
" *ip
ফিরে আসবে " এর মতো পড়তে হবে int
? তবে কেন ঘোষণার পরে অ্যাসাইনমেন্ট সেই প্যাটার্নটি অনুসরণ করে না? যদি কোনও শিক্ষানবিশ চলকটি আরম্ভ করতে চায় তবে কী হবে? int *ip = 1
(পড়া: *ip
একটি ফিরে আসবে int
এবং int
হয় 1
) না করবে না কাজ আশানুরূপ। ধারণাগত মডেলটি কেবল সুসংগত বলে মনে হয় না। আমি কি এখানে কিছু মিস করছি?
সম্পাদনা করুন: এটি এখানে উত্তরগুলি সংক্ষিপ্ত করার চেষ্টা করেছিল ।
*
একটি ঘোষণাপত্রে একটি টোকেন অর্থ "পয়েন্টার ঘোষণা করুন", অভিব্যক্তিগুলিতে এটি ডেরারেন্স অপারেটর এবং এই দুটি একইরকম চিহ্ন হিসাবে ঘটে যা বিভিন্ন জিনিসকে উপস্থাপন করে (গুণক অপারেটর হিসাবে একই - একই প্রতীক, ভিন্ন অর্থ)। এটি বিভ্রান্তিকর, তবে প্রকৃত অবস্থার চেয়ে ভিন্ন কিছু আরও খারাপ হতে চলেছে।
int* bar
ফলে এটি আরও সুস্পষ্ট করে তোলে যে তারাটি আসলে ধরণের অংশ, শনাক্তকারীর অংশ নয়। অবশ্যই এটি আপনাকে অনাবাদী স্টাফের মতো বিভিন্ন সমস্যায় ফেলেছে int* a, b
।
*
প্রসঙ্গে উপর নির্ভর করে দুটি পৃথক অর্থ থাকতে পারে। ঠিক একই অক্ষরটি বিভিন্ন শব্দের উপর নির্ভর করে উচ্চারণ করা যায় যার শব্দটিতে এটি বিভিন্ন ভাষায় কথা বলা শিখতে শক্ত করে তোলে। যদি প্রতিটি একক ধারণা / ক্রিয়াকলাপের নিজস্ব প্রতীক থাকে তবে আমাদের আরও বৃহত্তর কীবোর্ডগুলির প্রয়োজন হবে, সুতরাং এটিগুলি বোঝার জন্য যখন প্রতীকগুলি পুনর্ব্যবহার করা হয়।
int* p
) এর অংশ হিসাবে নক্ষত্রের উপর জোর দিন , যখন পয়েন্টারগুলি জড়িত থাকে তখন আপনার শিক্ষার্থীকে একই লাইনে একাধিক ঘোষণাপত্র ব্যবহারের বিরুদ্ধে সতর্ক করে দেওয়া হয়। শিক্ষার্থী যখন পয়েন্টারগুলির ধারণাটি সম্পূর্ণরূপে বুঝতে পারে, তখন শিক্ষার্থীকে ব্যাখ্যা করুন যে int *p
সিনট্যাক্সটি সমতুল্য এবং তারপরে একাধিক ঘোষণার মাধ্যমে সমস্যাটি ব্যাখ্যা করুন।