কেমন আছেন সবাই। আশা করি আল্লাহর রহমতে ভাল আছেন। আর সি এর প্র্যাকটিস নিয়মিত করে যাচ্ছেন।
গত পর্বে আমরা ফাংশন ও তার কিছু বেসিক দেখেছিলাম।আজকে আমরা দেখব ফাংশনের pass by value, pass by reference, recurrsion.
Pass by value হচ্ছে কোন একটি ফাংশন এর মধ্যে যে সকল ভ্যালু প্যারামিটার হিসেবে পাস করা হয়েছে তার ভ্যালু যদি ঐ ফাংশন এর মধ্যে চেঞ্জ করা হয় তবে ঐ চেঞ্জ শুধুমাত্র ঐ ফাংশন এর মধ্যেই চেঞ্জ হবে। ফাংশন যখন আবার যেখান থেকে কল করা হয়েছিল সেখানে ফেরত আসবে তখন ঐ প্যারামিটার এর ভ্যালু আগের মতই থাকবে।
নিচের উদাহরনটি দেখুন।
এখানে কিছু কথা বলে নেয়া ভাল, কোন ফাংশন এক্সেস করার সময় প্যারামিটার এর ভ্যারিএবল ও ফাংশন এর ভ্যারিএবল সংখ্যা অবশ্যই সমান হতে হবে। যেমন ধরুন কোন ফাংশন এর definition টা অনেকটা এরকম
int findmax(int a,int b,int c)
{
//internal code of function
}
এই ফাংশন এক্সেস করার জন্য কোড লিখা হলঃ
value= findmax(x,y,z);
তখন ঐ ফাংশন এর মধ্যে
-->a এর ভ্যালু হবে x এর ভ্যালু
-->b এর ভ্যালু হবে y এর ভ্যালু
-->c এর ভ্যালু হবে z এর ভ্যালু
যে সিরিয়ালে প্যারামিটার উল্লেখ করা হবে ভ্যালুও সেই সিরিয়ালে assigned হবে।
এবার আমরা উদাহরনটি নিয়ে আলোচনা করি। উদাহরনটিতে ফাংশন এর প্যারামিটার ভ্যালু হিসেবে শুধুমাত্র a এর ভ্যালু পাঠানো হয়েছে। আর ফাংশন এর মধ্যে ঐ ভ্যালুটি ডাবল হলেও সেই ডাবল ভ্যালুটি শুধুমাত্র ঐ ফাংশন এর মধ্যেই কার্যকর। তাই যখন main() function এ ফেরত এসেছে তখন a এর ভ্যালু হিসেবে ফাংশন এ যাওয়ার সময় যে ভ্যালু ছিল তাই থাকবে।
লক্ষ্য করুন, আমরা যখন ভ্যারিএবল বা অ্যারে নিয়ে আলোচনা করেছিলাম তখন আমরা বলেছিলাম যে, যদি কোন ভ্যারিএবল ডিক্লেয়ার করা হয় সেক্ষেত্রে মেমরীতে ঐ ভ্যারিএবল এর জন্য জায়গা তৈরী হয়। ফাংশন কল এর সময় আমরা যখন প্যারামিটার লিস্ট এ কোন ভ্যারিএবল এর নাম উল্লেখ করছি তখন ঐ ভ্যারিএবল এর ভ্যালুটা argument হিসেবে পাস হয়। আর ফাংশন এর ডেফিনেশন এর মধ্যে যে ভ্যারিএবল এর নাম উল্লেখ করা হয়, ঐ ভ্যারিএবল এর মেমরী লোকেশন এ যে argument receive হয় সেই ভ্যালুটাই assign হয়। তাই যখন ফাংশন এ কোন ভ্যারিএবল এর মান ডাবল করা হচ্ছে, তখনঐ ফাংশনের ভ্যারিএবল এর ভ্যালু ডাবল হচ্ছে, কিন্তু main() function এর মধ্যে উল্লেখিত ভ্যারিএবল এর মানের কোন পরিবর্তন হয় না। সেকারনে যখন main() function এ ফেরত আসে, তখন main() function এর ভ্যারিএবল এর ভ্যালুর কোন পরিবর্তন দেখা যায় না।
Pass by reference বোঝার জন্য আমাদের Pointer সম্পর্কে জানা থাকা প্রয়োজন। Pointer নিয়ে আমরা বিস্তারিত পরে দেখব। এখন শুধুমাত্র অল্প ধারনা নিন। তা না হলে pass by reference এর উদাহরনটি ঠিকভাবে বুঝতে পারবেন না।
Pointer variable হলো সে সকল ভ্যারিএবল যারা কোন ভ্যালুর পরিবর্তে "মেমরী লোকেশন" জমা রাখে।
Pointer variable declare করার নিয়মঃ
datatype *variable_name;
datatype হল pointer variable টি কোন integer এর মেমরী লোকেশন রাখবে, না double এর মেমরী লোকেশন রাখবে তা।
pointer variable নামের পূর্বে (*) asterix চিহ্ন দেয়া লাগে।
এতো গেল নাম ডিক্লেয়ার করা। প্রোগ্রাম এ pointer variable ব্যবহার সাধারন ভ্যারিএবল হতে কিছুটা আলাদা।
যেমনঃ ডিক্লেয়ার করার পর অন্য কোথাও যদি শুধুমাত্র ভ্যারিএবল এর নাম লিখা হয় তবে তা memory adderss নির্দেশ করে। আর যদি * দিয়ে ভ্যারিএবল এর নাম লিখা হয় তবে তা ঐ মেমরী লোকেশন এর ভ্যালু নির্দেশ করে।
নিচের প্রোগ্রামটি ও তার কমেন্ট এবং রান করে আউটপুট দেখলে pointer সম্পর্কে প্রাথমিক ধারনা পেয়ে যাবেন।
উল্লেখ্য, %X specifier হল হেক্সাডেসিমেল এ কোন ভ্যারিএবল এর মান দেখায়। মেমরীর কোন এড্রেস সাধারনত হেক্সাডেসিমেল এ দেখানো হয়। উপরের প্রোগ্রামটির আউটপুট এর ক্ষেত্রে u,*pu,v,*pv এর মান সমান (3) । &u,pu এর মান সমান,আবার &v,pv এর মান সমান,কিন্তু তা আলাদা আলাদা কম্পিউটারে আলাদা আলাদা হতে পারে।(মেমরী লোকেশন কি হবে তা সিস্টেম এর উপর নির্ভর করে) ।
Pass by reference এর মানে হচ্ছে প্যারামিটার হিসেবে কোন ভ্যারিএবল এর ভ্যালু পাস না করে ঐ ভ্যারিএবল এর মেমরী লোকেশন পাঠানো হয়। যার ফলে ফাংশন এর মধ্যে ঐ ভ্যারিএবল এর মান পরিবর্তন করা হলে ঐ পরিবর্তনটা main() function এ ফিরে আসার পরও বজায় থাকে।
নিচের উদাহরনটি দেখুন।
উপরের উদাহরনটিতে ভ্যারিএবল এর লোকেশন পাঠানো হয়েছে। ফলে ফাংশন এর মধ্যে ভ্যালুর পরিবর্তন হলে তা main() function এও বজায় থাকে। ফাংশন কল করার সময় মেমরী এড্রেস পাঠানো হলে সেইটি হল pass by reference. **** প্যারামিটার হিসেবে যদি কোন array পাস করা হয় তবে তা pass by reference হয়। যেমনঃ আমরা যখন কোন ক্যারেক্টার অ্যারে পাস করি তখন ঐ অ্যারের কোন value change করলে তা main() function এও চেঞ্জ থাকে।
ফাংশন এর আলোচনায় recursion কিছুটা জটিল। recursion নিয়ে কাল পারলে একটি সম্পুর্ন টিউন করব। আজ এ পর্যন্তই।
গতকালের সমাধানগুলো পেতেএখানে ক্লিক করুন।
আমার টিউন দেখে কেউ যদি উপকৃত হন, তবে আমার কষ্ট সার্থক হচ্ছে বলে মনে করি। আর একটি কথা। আপনাদের মতামত, অভিমত কিংবা সি নিয়ে যেকোন সমস্যা আমার সাথে শেয়ার করুন।
চাইলে আমাকে email ও করতে পারেন এই ঠিকানায়ঃ [email protected]
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 1)
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 2)
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 3)
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 4)
আমি বাকের। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 14 বছর 10 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 12 টি টিউন ও 81 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।
আমি আপনার নিয়মিত পাঠক জদিও একটু একটু সি জানি আপনার লেখা দেখে একটুর পরিমান বারাতে চেস্তা করতেসি ধন্যবাদ……………