C++ এ পয়েন্টার থেকে পয়েন্টার

C E Payentara Theke Payentara



এই নিবন্ধটি C++ এ পয়েন্টার থেকে পয়েন্টার ধারণা সম্পর্কে। পয়েন্টার থেকে পয়েন্টার পয়েন্টার বা অন্য পয়েন্টারের ঠিকানা সঞ্চয় করে এবং পয়েন্টার নিজেরাই ম্যানিপুলেশন সক্ষম করে। এই ধারণাটি ব্যবহার করে, আমরা সহজেই মেমরির অন্য অবস্থান থেকে একটি পয়েন্টার পরিবর্তন করতে পারি। ডাবল পয়েন্টারগুলি গতিশীলভাবে বরাদ্দ করা মেমরি বা মাল্টি-ডাইমেনশনাল অ্যারেতে উপকারী একটি অ্যারের উপাদানগুলিকে ম্যানিপুলেট করার জন্য। আমরা সঠিক উদাহরণ সহ এই পয়েন্টার থেকে পয়েন্টার কাজ এবং C++ এর ব্যবহার নিয়ে আলোচনা করব।

দৃশ্যকল্প 1: পয়েন্টার থেকে পয়েন্টারের মেমরি প্রতিনিধিত্ব

এই পরিস্থিতিতে, ডবল পয়েন্টার ঘোষণা করা পয়েন্টারের নামের আগে একটি অতিরিক্ত তারকাচিহ্ন (*) সহ পয়েন্টার ঘোষণার অনুরূপ। আমরা সহজেই C++ এ একটি ডাবল পয়েন্টারের মেমরি অবস্থান উপস্থাপন করতে পারি। পয়েন্টার থেকে পয়েন্টার কোড স্নিপেট নিম্নলিখিত দেওয়া হয়েছে:







# অন্তর্ভুক্ত করুন
নামস্থান std ব্যবহার করে;
int প্রধান ( )
{
int ডিজিট = পঞ্চাশ ;
int * ptrr;
ptrr = এবং অঙ্ক;
int ** ptrr1;
ptrr1 = এবং ptrr;
cout << 'পয়েন্টার মেমরি ঠিকানা হল: \n ' ;
cout << 'ptrr (পয়েন্টার): ' << ptrr << ' \n ' ;
cout << '*ptrr1 (ডাবল পয়েন্টার): ' <<* ptrr1 << ' \n ' ;
cout << পয়েন্টারে মান সঞ্চয় হয়: \n ' ;
cout << '*ptrr = ' <<* ptrr << endl;
cout << '**ptrr1 (পয়েন্টার থেকে পয়েন্টার) = ' <<** ptrr1 << endl;
ফিরে 0 ;
}


প্রধান ফাংশনে, আমরা একটি ভেরিয়েবল নিই যার মেমরির ঠিকানা একটি পয়েন্টারে সংরক্ষণ করা প্রয়োজন। এখন, আমরা 'ডিজিট' ভেরিয়েবল শুরু করি। এর পরে, আমরা 'ptrr' পয়েন্টার ঘোষণা করি যা 'ডিজিট' মেমরি ঠিকানা সংরক্ষণ করে। এখন, আমরা ডবল পয়েন্টার ঘোষণা করি যার নাম “**ptrr1” যা “*ptrr” পয়েন্টারের ঠিকানা সংরক্ষণ করে। কোডের শেষে, আমরা কনসোল স্ক্রিনে পয়েন্টার এবং ডবল পয়েন্টারের মেমরি এবং মান প্রদর্শন করি। এই কোডের আউটপুট নিম্নলিখিত উল্লেখ করা হয়েছে:




'ptrr' পয়েন্টারের মেমরি ঠিকানা হল '0x6ffe04', এবং '*ptrr1' পয়েন্টারটি 'ptrr' পয়েন্টারের মেমরি ঠিকানাও সংরক্ষণ করে। পয়েন্টারের ভিতরে সংরক্ষিত মান হল '50'। মূলত, ডাবল পয়েন্টারের ঠিকানা সবসময় পয়েন্টারের মেমরি ঠিকানার মতোই থাকে।



দৃশ্য 2:  ফাংশন প্যারামিটার হিসাবে পয়েন্টার থেকে পয়েন্টার

এই পরিস্থিতিতে, আমরা শিখব যে কোনও ভেরিয়েবলে অস্থায়ী মেমরি বরাদ্দ করার জন্য প্যারামিটার হিসাবে যে কোনও ফাংশনে ডাবল পয়েন্টারটি কীভাবে পাস করা যায়। ডবল পয়েন্টার সহ ফাংশন প্যারামিটারের কোড স্নিপেট নিম্নলিখিতটিতে উল্লেখ করা হয়েছে:





#অন্তর্ভুক্ত করুন
অকার্যকর getMemoryAddress ( int ** double_ptr ) {
আপনি আবহাওয়া = 200 ;
* double_ptr = এবং তাপমাত্রা
}

int প্রধান ( ) {
int * ptr_1;
int ** double_ptr;
double_ptr = এবং ptr_1;
getMemoryAddress ( double_ptr ) ;
std::cout << '**ডবল_পিটিআর এর মান হল : ' << ** double_ptr << std::endl;
ফিরে 0 ;
}


এখানে, আমরা শিখব কিভাবে পয়েন্টার থেকে পয়েন্টার ধারণা C++ এ কাজ করে। মনে রাখবেন যে একটি ডবল পয়েন্টার দিয়ে কাজ করার জন্য প্রোগ্রামে একটি পয়েন্টার ঘোষণা করা হয়। সুতরাং, আমরা 'getMemoryAddress' ফাংশন তৈরি করি। আমরা এই ফাংশনটি ডিজাইন করি যাতে আমরা যখন প্যারামিটারটি পাস করি, তখন এটি স্বয়ংক্রিয়ভাবে ডাবল পয়েন্টারের মেমরি ঠিকানা পায়।

ফাংশনে, আমরা 'tempp' ভেরিয়েবল এবং '**double_ptr' ডবল পয়েন্টার নিই। আমরা নির্দিষ্ট ভেরিয়েবলের ঠিকানা পাস করি যা 'tempp' ডাবল পয়েন্টারে এবং ডবল পয়েন্টার মান ফাংশনের আর্গুমেন্ট হিসাবে। প্রোগ্রামটি কনসোল স্ক্রিনে প্রধান ফাংশন কোডের ফলাফল প্রদর্শন করে, তাই মূল ফাংশনে থাকা সমস্ত জিনিস কার্যকর করা যায়। আমরা প্রধান ফাংশনে 'ptr_1' পয়েন্টার এবং ডাবল পয়েন্টারটিকে 'double_ptr' হিসাবে নিই। আমরা ডবল পয়েন্টার পয়েন্টার ঠিকানা পাস.



এখন, আমরা ওভাররাইড ফাংশনে ডাবল পয়েন্টার ভেরিয়েবল পাস করি এবং ডাবল পয়েন্টারের ফলাফল দেখানোর জন্য 'cout' আউটপুট স্ট্রিম স্টেটমেন্টে পয়েন্টারটিকে পয়েন্টার ভেরিয়েবলে পাস করি।

যখন কম্পাইলার ওভাররাইড ফাংশনে পৌঁছায়, কম্পাইলার চেকার যেখানে এই ফাংশনটি সংজ্ঞায়িত করা হয়েছে সেটি ফাংশনের ভিতরে কোডটি কার্যকর করে এবং ফলাফলটি মূল ফাংশনে ফিরিয়ে দেয়।

এই কোডের আউটপুট নিম্নলিখিত সংযুক্ত করা হয়েছে:


ফলাফল: ডাবল পয়েন্টারের মান 200।

দৃশ্যকল্প 3: পয়েন্টার থেকে পয়েন্টার সহ 2D অ্যারে ব্যবহার করা

এই উদাহরণে, আমরা একটি ডবল পয়েন্টার সহ একটি 2D অ্যারে নিয়ে কাজ করব। আমরা একটি অ্যারে গ্রহণ করি এবং পয়েন্টারে একটি অ্যারের ঠিকানা পাস করি। এই দৃশ্যের সম্পূর্ণ কোড নিম্নরূপ প্রদান করা হয়:

int প্রধান ( ) {
const int সারি = 3 ;
const int cols = 2 ;
int ** ম্যাট্রিক্স = নতুন int * [ সারি ] ;
জন্য ( int i = 0 ; i < সারি; ++আমি ) {
ম্যাট্রিক্স [ i ] = নতুন int [ কলস ] ;
}
জন্য ( int i = 0 ; i < সারি; ++আমি ) {
জন্য ( int j = 0 ; j < cols; ++জ ) {
ম্যাট্রিক্স [ i ] [ j ] = i * cols + j;
}
}
জন্য ( int i = 0 ; i < সারি; ++আমি ) {
জন্য ( int j = 0 ; j < cols; ++জ ) {
cout << ম্যাট্রিক্স [ i ] [ j ] << '' ;
}
cout << endl;
}
জন্য ( int i = 0 ; i < সারি; ++আমি ) {
মুছে ফেলা [ ] ম্যাট্রিক্স [ i ] ;
}
মুছে ফেলা [ ] ম্যাট্রিক্স;
ফিরে 0 ;
}


আমরা সবাই জানি, আমাদের একটি 2D অ্যারেতে অনেক সারি এবং বেশ কয়েকটি কলাম রয়েছে। প্রধান ফাংশনে, আমরা 'const int' আছে এমন সারি এবং কলামগুলি শুরু করি। এর পরে, আমরা সারিগুলির জন্য মেমরির স্থান এবং প্রতিটি সারির সাথে কলামগুলির জন্য মেমরির স্থান বরাদ্দ করি। আমরা ম্যাট্রিক্স ডাবল পয়েন্টারে পয়েন্টার হিসাবে সারির মানকে '**ম্যাট্রিক্স' হিসাবে পাস করি। এই ডাবল পয়েন্টারে, সারির সংখ্যার লুপটি কার্যকর বা সত্য হয়। তারপরে, শর্তটি মিথ্যা না হওয়া পর্যন্ত আরেকটি অভ্যন্তরীণ লুপ কার্যকর করা হয়।

মেমরি বরাদ্দের পরে, আমরা আবার একটি অ্যারেতে একটি মান নির্ধারণ করি: সারিগুলির জন্য একটি বাইরের লুপ এবং 2D অ্যারের কলামগুলির জন্য একটি অভ্যন্তরীণ লুপ৷ অভ্যন্তরীণ লুপে, সারি এবং কলামের মান ডাবল পয়েন্টারে বরাদ্দ করা হয় এবং একটি প্রয়োজনীয় গাণিতিক ক্রিয়াকলাপ সম্পাদন করে। আমরা মেমরিতে বরাদ্দ করা সারি এবং কলামের সংখ্যার মতো একটি 2D অ্যারের মান প্রদর্শন করি। সারি এবং কলামের সংখ্যা সর্বদা ডবল পয়েন্টারকে নির্দেশ করে যা সারি এবং কলামের মান সংরক্ষণ করে। শেষ পর্যন্ত, আমরা মেমরিটি সাফ করি এবং C++ এ মেমরি থেকে এই অ্যারেটিকে ডিলোকেট করি।

একটি ডবল পয়েন্টার সহ 2D অ্যারের আউটপুট নিম্নলিখিতটিতে সংযুক্ত করা হয়েছে:

দৃশ্যকল্প 4: পয়েন্টার থেকে পয়েন্টার ব্যবহার করে পয়েন্টার অদলবদল করা

এখানে, আমরা শিখব কিভাবে ডাবল পয়েন্টার ঘোষণা করে C++ এ পয়েন্টার অদলবদল করতে হয়। এই দৃশ্যের কোড স্নিপেট নিম্নলিখিত সংযুক্ত করা হয়েছে:

# অন্তর্ভুক্ত করুন
অকার্যকর অদলবদল ( int ** ptrr_1, আপনি ** ptrr_2 ) {
int * temp_var = * ptrr_1;
* ptrr_1 = * ptrr_2;
* ptrr_2 = temp_var;
}
int প্রধান ( ) {
int x = পনের , y = 25 ;
int * ptrrA = এবং এক্স, * ptrrB = এবং এবং;
std::cout << 'অদলবদল করার আগে: *ptrrA হল = ' << * ptrrA << ', *ptrrB হল = ' << * ptrrB << std::endl;
অদলবদল ( এবং ptrrA, এবং ptrrB ) ;
std::cout << 'অদলবদল করার পরে: *ptrrA is = ' << * ptrrA << ', *ptrrB  is=' << * ptrrB << std::endl;
ফিরে 0 ;
}


প্রথমত, আমরা সোয়াপ ফাংশন তৈরি করি, ফাংশন আর্গুমেন্ট হিসাবে উভয় পয়েন্টারকে পাস করি। সোয়াপ ফাংশনে, আমরা 'টেম্প' পয়েন্টার নিই এবং কিছু সময়ের জন্য 'temp' এ 'পয়েন্টার1' এর মান পাস করি। তারপর, আমরা 'পয়েন্টার 2' এর মান 'পয়েন্টার1' এ পাস করি। শেষ পর্যন্ত, আমরা 'টেম্প' পয়েন্টারের মান 'পয়েন্টার2' এ পাস করি।

প্রধান ফাংশনে, আমাদের দুটি পয়েন্টার প্রয়োজন যা আমরা 'swap' ফাংশনে পাস করি বা ওভাররাইড করি। আমরা প্রদত্ত পয়েন্টারগুলিতে ভেরিয়েবলের ঠিকানাগুলি পাস করি। তারপর, পয়েন্টার অদলবদল করার আগে এবং পরে পয়েন্টারের মান প্রদর্শিত হয়।

এই কোডের আউটপুট নিম্নলিখিত সংযুক্ত করা হয়েছে:


আমরা দেখতে পাচ্ছি, C++ এ একটি ডবল পয়েন্টার ব্যবহার করে পয়েন্টারের মান সফলভাবে অদলবদল করা হয়েছে।

উপসংহার

আমরা উপসংহারে পৌঁছেছি যে পয়েন্টার থেকে পয়েন্টার সবসময় C++ এ যেকোনো পয়েন্টারের মেমরি ঠিকানা সংরক্ষণ করে। যে কোনো মুহূর্তে যেকোনো পয়েন্টারের মেমরি অবস্থান অস্থায়ীভাবে ব্যবহার করতে আমরা ডাবল পয়েন্টার ব্যবহার করতে পারি। এটি মেমরি ঠিকানাকে পরোক্ষভাবে ম্যানিপুলেট করার এবং ডেটার কাছে যাওয়ার একটি খুব কার্যকর উপায়।