আমি প্রায়শই পয়েন্টারগুলির সুবিধা (নিম্ন স্তরের প্রোগ্রামিং ব্যতীত) দেখার জন্য লড়াই করি।
স্ট্রিং বা চরের পরিবর্তে চর * কেন ব্যবহার করুন বা পয়েন্টার পাটিগণিত কী কী সুবিধা নিয়ে আসে।
সুতরাং পয়েন্টারগুলির সুবিধা এবং ব্যবহারের ক্ষেত্রে কী কী?
আমি প্রায়শই পয়েন্টারগুলির সুবিধা (নিম্ন স্তরের প্রোগ্রামিং ব্যতীত) দেখার জন্য লড়াই করি।
স্ট্রিং বা চরের পরিবর্তে চর * কেন ব্যবহার করুন বা পয়েন্টার পাটিগণিত কী কী সুবিধা নিয়ে আসে।
সুতরাং পয়েন্টারগুলির সুবিধা এবং ব্যবহারের ক্ষেত্রে কী কী?
উত্তর:
গতিশীল মেমরি অবস্থান, অনেক ডেটা স্ট্রাকচার এবং বিপুল পরিমাণে ডেটা দক্ষ পরিচালনা করার জন্য পয়েন্টারগুলি প্রয়োজনীয় পয়েন্টার ব্যতীত, আপনাকে বিশ্বব্যাপী বা ফাংশন বা সমতুল্য সমস্ত প্রোগ্রামের ডেটা বরাদ্দ করতে হবে এবং আপনি মূলত যা অনুমতি দিয়েছিলেন তার চেয়ে বেশি পরিমাণের ডেটা বৃদ্ধি পেলে আপনার কোনও উপায় নেই। আমি এখানে বিস্মৃত ব্যবহার করতে দ্বিধা বোধ করি, তবে যতদূর আমি জানি সমস্ত আধুনিক কম্পিউটারের ভাষার কোনও না কোনও রূপে পয়েন্টার রয়েছে।
বেশিরভাগ ভাষায় যেগুলি পয়েন্টার ব্যবহার করে, সেখানে নির্দিষ্ট ধরণের রেফারেন্স রয়েছে যা পয়েন্টার এবং সম্ভবত কিছু প্রকারের রেফারেন্স যা নয়, এবং এর পরে আর কোনও তাত্পর্যপূর্ণ পার্থক্য নেই। একটি লিস্প cons
সেলটি পয়েন্টারগুলির এক জোড়া, যদিও fixnum
এটি কোনও পয়েন্টার নয়। জাভাতে, বর্গের উদাহরণের জন্য ব্যবহৃত ভেরিয়েবলটি পয়েন্টার হয় তবে একটি int
হয় না। ভাষার বাক্য গঠনটি এর প্রতিফলন করে না।
সিটি অস্বাভাবিক যে পয়েন্টারগুলি expচ্ছিক, সুস্পষ্ট এবং সুস্পষ্ট পয়েন্টার গাণিতিকের অনুমতি দেয়। এটি লেখা সম্পূর্ণভাবে সম্ভব struct foo bar; struct foo * baz;
, এবং একবার আপনি মেমরি বরাদ্দ করার জন্য baz
আপনি উভয়ই ব্যবহার করতে পারেন bar
এবং এর baz
প্রতিনিধিত্ব করতে পারেন struct foo
। যেহেতু পয়েন্টারগুলি alচ্ছিক, তাই নোটের পার্থক্য থাকা দরকারী। (স্মার্ট পয়েন্টারগুলির জন্য এটি সি ++ এ অপরিহার্য, যেমনটি দেওয়া আছে boost::shared_ptr<foo> bar;
, bar.reset()
এর একটি অর্থ রয়েছে এবং bar->reset()
সম্ভবত এটির চেয়ে অনেক আলাদা আলাদা ধারণা রয়েছে have)
(প্রকৃতপক্ষে, স্পষ্ট পয়েন্টারগুলি প্রায়শই অন্যান্য ভাষায় ব্যবহৃত হত যখন সিটি মূলত বিকশিত হয়েছিল যেমন ^
প্যাস্কালে C আজ সাধারণ ব্যবহারের চেয়ে সি একটি প্রাচীন ভাষা এবং এটি প্রদর্শিত হয়))
সি এর ডিজাইনের লক্ষ্যগুলির মধ্যে একটি হ'ল ইউনিক্স লিখতে হয়েছিল এবং অতএব এটির জন্য বিশদ পদ্ধতিতে মেমরির অবস্থানগুলি পরিচালনা করা দরকার। (সি বাস্তবে এমন একটি সিস্টেম প্রয়োগকারী ভাষাগুলির মধ্যে অন্যতম প্রচলিত ভাষা যখন এটি ডিজাইন করা হচ্ছিল, তার অন্য উদাহরণ কন্ট্রোল ডেটা কম্পিউটারের সাইবোল C সি এটি একটি বড় আঘাত হ'ল)) সুতরাং, সি পয়েন্টারগুলি সরাসরি পরিচালনা করা সম্ভব, মেমরি ঠিকানা নির্ধারণ এবং একটি নতুন গণনা করা। এটি সিতে কিছু নকশার সিদ্ধান্ত নিয়েছে, সি অ্যারেগুলি পয়েন্টার গাণিতিকের উপর নির্ভরশীল এবং সত্যিই একটি অ্যারে খুব পরিস্থিতিতে অনেকগুলি ক্ষেত্রে পয়েন্টার হয়ে যায়। রেফারেন্স দ্বারা সি ফাংশনে ভেরিয়েবলগুলি পয়েন্টার দ্বারা সম্পন্ন করা হয়। অন্যান্য সমসাময়িক ভাষাগুলির যে আকারে রেফারেন্স দিয়ে অ্যারে এবং পাসিং ভেরিয়েবলগুলির জোর প্রয়োজন ছিল না তাই সি সেগুলি পান নি।
সুতরাং, উত্তরটি হ'ল, আজকাল বেশিরভাগ ভাষায়, আপনি সত্যটি মনে করিয়ে না দিয়ে ক্রমাগত পয়েন্টার ব্যবহার করেন। সিতে এবং কিছুটা কম সি ++ তে আপনি নিম্ন-স্তরের জিনিসগুলি করার জন্য বা পয়েন্টার ব্যবহার করেন বা উচ্চ-স্তরের জিনিসগুলি সম্পাদন করেন যার জন্য বিশেষ কোনও চিহ্ন নেই।
জটিল তথ্য কাঠামো। আপনি বিনা পয়েন্ট ছাড়া লিঙ্কযুক্ত তালিকার মতো বা বাইনারি গাছের মতো কিছু তৈরি করতে পারবেন না।
পয়েন্টারগুলির কোনও "উপকার" এবং "কনস" নেই। এগুলি কেবল একটি হাতুড়ির মতো একটি সরঞ্জাম।
সি ++, জাভা এবং অন্যান্য একই ধরণের ভাষার উল্লেখ কেবল 'নিরাপদ পয়েন্টার'। এবং এই উল্লেখগুলি জাভাতে প্রচুর ব্যবহৃত হয়।
NULL
যাবে না এবং তারা তৈরি হওয়ার পরে তাদের সংশোধন করা যাবে না।
খুব সুন্দর যে কোনও কম্পিউটার প্রোগ্রামের মেমরির মূল্যগুলি পরিদর্শন করা এবং এটি পরিবর্তন করা দরকার (আমাদের মধ্যে যারা যথেষ্ট বয়স্ক তাদের কাছে উঁকি দেওয়া এবং ছুঁকানো হিসাবে পরিচিত)। স্মৃতিতে কোথায় এই মানগুলি রয়েছে তা আপনাকে নিয়ন্ত্রণ করতে হবে, যাতে ফলাফলটি পূর্বাভাসযোগ্য (এবং নির্দিষ্ট ক্ষেত্রে ক্রমটি গুরুত্বপূর্ণ: এক্সিকিউটেবল কোড লোড করা একটি উদাহরণ)। অতএব আপনার কাছে এমন একটি ডেটা টাইপ থাকা দরকার যা মেমরিতে কোনও অবস্থানের প্রতিনিধিত্ব করে। এমনকি যদি আপনার প্রোগ্রামিং পরিবেশটি কোনও বিমূর্ততার আওতায় লুকায় তবে এটি এখনও রয়েছে।
char*
পয়েন্টারগুলির একটি ক্ষোভজনক উদাহরণ। আপনি সম্ভবত std::string
(বা আরও ভাল টাইপ যা আপনার ইউনিকোড / আন্সি / মাল্টিবাইট বিশেষত্ব পরিচালনা করে) ব্যবহার করা থেকে ভাল char*
। পয়েন্টার প্রায় অন্য কোন উদাহরণস্বরূপ ( Employee*
, PurchaseOrder*
, ...) কিন্তু, অনেক সুবিধা রয়েছে:
প্রকৃতপক্ষে, পয়েন্টারগুলি এত গুরুত্বপূর্ণ যে বেশিরভাগ ভাষাগুলির কাছে সেগুলি না থাকায় বাস্তবে কেবল সেগুলি থাকে। সি # এবং জাভাতে রেফারেন্সের ধরণগুলি মূলত শক্ত বস্তু হিসাবে ছদ্মবেশী পয়েন্টার।
এখন, পয়েন্টার ম্যানিপুলেশন ( p++
একটি পয়েন্টারে, বা p += delta
) পুরো 'নটর গল্প'। কিছু লোক এটিকে বিপজ্জনক বলে মনে করেন, কিছু লোক মনে করেন এটি দুর্দান্ত। তবে এটি আপনার প্রশ্ন থেকে আরও দূরে।
পয়েন্টারগুলি দ্রুততর হতে পারে এবং ডেটা স্ট্রাকচারে এবং প্রোগ্রামের প্রয়োগের পদাঙ্কটি নীচে রেখে উভয়ই কম ওভারহেড ব্যয় করতে পারে। (দয়া করে 'ক্যান' শব্দটি নোট করুন))
সাধারণভাবে নিয়মটি হ'ল, যদি আপনি কোনও নিজস্ব বরাদ্দ সম্পাদন করে বা আপনার পক্ষ থেকে কিছু করার মাধ্যমে কোনও সংস্থান বরাদ্দ করে থাকেন তবে তা হয়ে গেলে তা ছেড়ে দেওয়া আপনার কাজ।
উপরের কাজটির বোঝাটি রানটাইমটি না করে বরং দায়বদ্ধতাটিকে বিকাশকারীকে ফিরিয়ে দেয়। এতে আরও কিছু সুবিধা রয়েছে যে জিনিসগুলি দীর্ঘায়িত হতে পারে, বা সীমানা পেরিয়ে থাকতে পারে, বা আরও উপযুক্ত সময়ে নিষ্পত্তি করা যেতে পারে, বা কোনও আবর্জনা সংগ্রহকারীকে ওজন বহন করার প্রয়োজন নেই।
বহিরাগত ক্ষেত্রে, সাধারণত ব্যাতিক্রম এবং স্কোপ জড়িত থাকে, এমন কয়েকটি প্রান্তের ক্ষেত্রে রয়েছে যা কোডটি ক্লিনআপটি পরিহার করে যদি এড়ানো যায় তবে কিছুটা বেশি সতর্ক হওয়া দরকার। বাস্তবিকভাবে, এই কেসগুলি চারপাশে নকশা করা যেতে পারে। আমরা বহু দশক ধরে পরিচালিত কোড ব্যতীত বেঁচে ছিলাম।
প্রায়শই পয়েন্টারগুলিকে কী "শক্ত" করে তোলে তা কেবল হার্ডওয়্যার স্তরে কী চলছে তা বোঝা যায় না। এটা ইন্ডিয়ারেশন ছাড়া আর কিছুই নয়।
পয়েন্টারগুলি আপনাকে আরও অনেকগুলি কাঁচা অ্যাক্সেস দেয় এবং এটি খুব সহায়ক, চতুর বা প্রয়োজনীয় হতে পারে। আপনি যে কোনও জায়গায় ইঙ্গিত করতে পারেন এবং এটিকে যেকোন কিছু হিসাবে চিকিত্সা করতে পারেন। যদি আপনি নিজের Godশ্বরের মতো শক্তিগুলি ভাল ব্যবহার করেন তবে এটি খুব, খুব ভাল।
কোন দিকটি প্রকাশ করতে ভুলে যাওয়া, বা একাধিকবার প্রকাশের মাধ্যমে, বা প্রকাশের পরে কিছু উল্লেখ করে বা আপনি কোথাও নির্দেশ না দিলে কোনও জিনিস পুনরায় ফিরিয়ে দেওয়ার মাধ্যমে সাধারণত কোণটি নষ্ট হয়। এই জিনিসগুলি প্রায়শই দর্শনীয় ক্রাশগুলির ফলাফল করে এবং সত্য কথা বলতে সাধারণত ইঙ্গিত দেওয়া হয় যে আপনি পয়েন্টারগুলি ভঙ্গুর না করে বরং যুক্তিযুক্ত সমস্যা পেয়েছেন।
আপনি যদি কোনও দৃ develop় বিকাশকারী হন তবে পয়েন্টার ব্যবহার করা অন্য কোনও ডেটা স্ট্রাকচারের চেয়ে বেশি সমস্যাযুক্ত হওয়া উচিত নয়। আবার, এটি রকেট বিজ্ঞান নয়, এবং কয়েক দশক ধরে লোকেরা চোখের জলও ছাড়াই এটি করে। এই দিনগুলিতে এটি কেবলমাত্র কম পড়া যায়।
যা কিছু বলেছে, যদি না আপনার পয়েন্টারের প্রয়োজন হয়, তবে ভাল আবর্জনা সংগ্রহের সরবরাহকারী বাহ্যিক এবং বহিরাগত ক্ষেত্রে পরিচালিত পরিবেশে কাজ করা বেশ উত্তম। কিছু স্মৃতি অর্জন করতে, এটি ব্যবহার করতে এবং এটিকে ত্যাগ করতে সক্ষম হওয়ায় এটি জেনে যায় যে কিছু সময় পরে, এটি যদি বোধগম্য হয় তবে তা ফেলে দেওয়া হবে। কোডারের অংশে এটি কিছুটা কম কোড, একটি রানটাইমের বিনিময়ে কিছু অতিরিক্ত উত্তোলন করে।
সেরা উত্তরটি আসলে প্রশ্নের মধ্যে অন্তর্ভুক্ত রয়েছে: পয়েন্টারগুলি নিম্ন-স্তরের প্রোগ্রামিংয়ের জন্য। মঞ্জুর, আপনি সি ব্যবহার করছেন, পয়েন্টার ব্যবহার না করা আপনার পিছনে পিছনে একটি হাত বাঁধা প্রোগ্রামিংয়ের মত, তবে এর উত্তরটি পরিবর্তে উচ্চ স্তরের ভাষা ব্যবহার করা।