ব্যবহারের ক্ষেত্রে এবং পয়েন্টারগুলির সুবিধা কী কী? [বন্ধ]


10

আমি প্রায়শই পয়েন্টারগুলির সুবিধা (নিম্ন স্তরের প্রোগ্রামিং ব্যতীত) দেখার জন্য লড়াই করি।

স্ট্রিং বা চরের পরিবর্তে চর * কেন ব্যবহার করুন বা পয়েন্টার পাটিগণিত কী কী সুবিধা নিয়ে আসে।

সুতরাং পয়েন্টারগুলির সুবিধা এবং ব্যবহারের ক্ষেত্রে কী কী?


6
এটি কিছুটা এলিটালিস্ট শোনাচ্ছে, তবে আইএমএইচও যদি আপনাকে পয়েন্টারগুলির পক্ষে ভাল এবং কনস সম্পর্কে জিজ্ঞাসা করতে হয় তবে সম্ভবত আপনার তাদের প্রয়োজন নেই don't
জেস

3
সম্ভবত! তবে প্রশ্নটি এখনও বৈধ!
জোলোমন

1
এটি প্রকৃতপক্ষে ভাষা-অজ্ঞাতিকও নয়, কারণ অনেকগুলি প্রোগ্রামিং ভাষারই সি অর্থে সত্যিকারের পয়েন্টার নেই।
ডেভিড থর্নলি

উত্তর:


6

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

বেশিরভাগ ভাষায় যেগুলি পয়েন্টার ব্যবহার করে, সেখানে নির্দিষ্ট ধরণের রেফারেন্স রয়েছে যা পয়েন্টার এবং সম্ভবত কিছু প্রকারের রেফারেন্স যা নয়, এবং এর পরে আর কোনও তাত্পর্যপূর্ণ পার্থক্য নেই। একটি লিস্প 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 সি এটি একটি বড় আঘাত হ'ল)) সুতরাং, সি পয়েন্টারগুলি সরাসরি পরিচালনা করা সম্ভব, মেমরি ঠিকানা নির্ধারণ এবং একটি নতুন গণনা করা। এটি সিতে কিছু নকশার সিদ্ধান্ত নিয়েছে, সি অ্যারেগুলি পয়েন্টার গাণিতিকের উপর নির্ভরশীল এবং সত্যিই একটি অ্যারে খুব পরিস্থিতিতে অনেকগুলি ক্ষেত্রে পয়েন্টার হয়ে যায়। রেফারেন্স দ্বারা সি ফাংশনে ভেরিয়েবলগুলি পয়েন্টার দ্বারা সম্পন্ন করা হয়। অন্যান্য সমসাময়িক ভাষাগুলির যে আকারে রেফারেন্স দিয়ে অ্যারে এবং পাসিং ভেরিয়েবলগুলির জোর প্রয়োজন ছিল না তাই সি সেগুলি পান নি।

সুতরাং, উত্তরটি হ'ল, আজকাল বেশিরভাগ ভাষায়, আপনি সত্যটি মনে করিয়ে না দিয়ে ক্রমাগত পয়েন্টার ব্যবহার করেন। সিতে এবং কিছুটা কম সি ++ তে আপনি নিম্ন-স্তরের জিনিসগুলি করার জন্য বা পয়েন্টার ব্যবহার করেন বা উচ্চ-স্তরের জিনিসগুলি সম্পাদন করেন যার জন্য বিশেষ কোনও চিহ্ন নেই।


খুব সুন্দর উত্তর
কেট গ্রেগরি

1
আমি এই উত্তরটি গ্রহণ করি কারণ এটি সি / সি ++ এবং জাভাতে রেফারেন্সের মধ্যে আমি যে পার্থক্যটি বুঝতে পারি না তার সেরা বর্ণনা করে।
অলিভারস

গোসলিং (জাভার মূল নির্মাতা) দ্বারা উপলব্ধ জাতির "কন" কে আরও পরিষ্কার করার জন্য জাভা কেন পয়েন্টার ব্যবহার করে না তার একটি সংক্ষিপ্ত ব্যাখ্যা যুক্ত করা ভাল।
গাইডো আনসেলমি

10

জটিল তথ্য কাঠামো। আপনি বিনা পয়েন্ট ছাড়া লিঙ্কযুক্ত তালিকার মতো বা বাইনারি গাছের মতো কিছু তৈরি করতে পারবেন না।

পয়েন্টারগুলির কোনও "উপকার" এবং "কনস" নেই। এগুলি কেবল একটি হাতুড়ির মতো একটি সরঞ্জাম।


5
জাভাতে, কোনও পয়েন্টার নেই। তবুও, লিঙ্কযুক্ত তালিকা এবং বাইনারি গাছ তৈরি করা সম্ভব। রেফারেন্স (জাভা হিসাবে) এবং পয়েন্টার (সি হিসাবে হিসাবে) মধ্যে পার্থক্য আছে।
StartClass0830

7
রেফারেন্স এবং পয়েন্টারগুলির মধ্যে কোনও পার্থক্য নেই। পয়েন্টার গাণিতিকটি সি-নির্দিষ্ট; অন্যান্য ভাষাগুলির মধ্যে পয়েন্টার রয়েছে তবে পয়েন্টার গাণিতিক নেই (যেমন, পাস্কাল)।
zvrba

1
পয়েন্টার এবং রেফারেন্সগুলি যেমন আপনি ভাবেন তেমন সমার্থক নয়। পার্থক্যগুলি দেখতে এটি পড়ুন। stackoverflow.com/questions/57483/...
StartClass0830

4
এই তালিকার প্রথম দুটি আইটেম সম্বোধন করার জন্য: জাভা রেফারেন্সগুলি পুনরায় নিয়োগ দেওয়া যেতে পারে এবং তারা বাতিল করতে পারে। পয়েন্টারের স্বতন্ত্র বৈশিষ্ট্যটি হ'ল আপনাকে পরোক্ষভাবে অন্য কোনও বস্তুর রেফারেন্স করতে দেয়। আমার লিটমাস পরীক্ষাটি হ'ল: যদি আপনি বিজ্ঞপ্তি ডেটা স্ট্রাকচার তৈরি করতে পারেন (যা আপনি জাভা রেফারেন্স সহ করতে পারেন), এটি একটি পয়েন্টার। (দ্রষ্টব্য যে আপনি সি ++ রেফারেন্স সহ বিজ্ঞপ্তি তথ্য কাঠামো তৈরি করতে পারবেন না।)
zvrba

1
পয়েন্টার এবং রেফারেন্সের মধ্যে পার্থক্য রয়েছে। উদাহরণস্বরূপ, সি # এর দুটি রয়েছে । ( Blogs.msdn.com/b/ericlippert/archive/2009/02/17/... )
স্টিভেন Evers

2
  • পয়েন্টারগুলির সাহায্যে আপনি রানটাইমে মেমরি বরাদ্দ করতে এবং হ্রাস করতে পারেন।
  • এবং অনুলিপি করা ছাড়াই আপনি এর অনুমোদিত সুযোগের বাইরে বড় আকারের ডেটা-স্ট্রাকচার ব্যবহার করতে পারেন।

সি ++, জাভা এবং অন্যান্য একই ধরণের ভাষার উল্লেখ কেবল 'নিরাপদ পয়েন্টার'। এবং এই উল্লেখগুলি জাভাতে প্রচুর ব্যবহৃত হয়।


1
সি ++ তে উল্লেখগুলি নিরাপদ পয়েন্টার নয়। সি ++ তে রেফারেন্সগুলির পয়েন্টারগুলির সাথে কিছুই করার নেই। সি ++ এ থাকা রেফারেন্সগুলি এ্যালিয়াস হয় । এগুলিকে বরাদ্দ করা NULLযাবে না এবং তারা তৈরি হওয়ার পরে তাদের সংশোধন করা যাবে না।
বিলি ওনিল

@ বিলি: সি ++ রেফারেন্সগুলি সাধারণত পয়েন্টার ব্যবহার করে প্রয়োগ করা হয় এবং কিছু কিছু ক্ষেত্রে একইভাবে কাজ করে, তাই লোকেরা তাদেরকে কিছুটা বাধা পয়েন্টার হিসাবে ভাবতে থাকে।
ডেভিড থর্নলি

2

খুব সুন্দর যে কোনও কম্পিউটার প্রোগ্রামের মেমরির মূল্যগুলি পরিদর্শন করা এবং এটি পরিবর্তন করা দরকার (আমাদের মধ্যে যারা যথেষ্ট বয়স্ক তাদের কাছে উঁকি দেওয়া এবং ছুঁকানো হিসাবে পরিচিত)। স্মৃতিতে কোথায় এই মানগুলি রয়েছে তা আপনাকে নিয়ন্ত্রণ করতে হবে, যাতে ফলাফলটি পূর্বাভাসযোগ্য (এবং নির্দিষ্ট ক্ষেত্রে ক্রমটি গুরুত্বপূর্ণ: এক্সিকিউটেবল কোড লোড করা একটি উদাহরণ)। অতএব আপনার কাছে এমন একটি ডেটা টাইপ থাকা দরকার যা মেমরিতে কোনও অবস্থানের প্রতিনিধিত্ব করে। এমনকি যদি আপনার প্রোগ্রামিং পরিবেশটি কোনও বিমূর্ততার আওতায় লুকায় তবে এটি এখনও রয়েছে।


2

char*পয়েন্টারগুলির একটি ক্ষোভজনক উদাহরণ। আপনি সম্ভবত std::string(বা আরও ভাল টাইপ যা আপনার ইউনিকোড / আন্সি / মাল্টিবাইট বিশেষত্ব পরিচালনা করে) ব্যবহার করা থেকে ভাল char*। পয়েন্টার প্রায় অন্য কোন উদাহরণস্বরূপ ( Employee*, PurchaseOrder*, ...) কিন্তু, অনেক সুবিধা রয়েছে:

  • একক ক্রিয়াকলাপের চেয়ে বৃহত্তর স্কোপ - স্তূপে অবজেক্টটি বরাদ্দ করুন এবং দীর্ঘ সময় ধরে পয়েন্টারটি পাস করুন
  • আপনার কাছে পাস-বাই-মানের অনুলিপি ব্যয় না হওয়ার কারণে দ্রুত ফাংশন বড় আকারের বস্তুগুলির জন্য কল করে
  • এটিতে পরামিতিগুলি পরিবর্তন করার জন্য কোনও ফাংশন সক্ষম করার এক উপায়
  • সংগ্রহের সময় স্থান এবং সময়টিকে একটি সম্পূর্ণ অবজেক্টের পরিবর্তে কেবল একটি ঠিকানা অনুলিপি করতে সঞ্চয় করুন

প্রকৃতপক্ষে, পয়েন্টারগুলি এত গুরুত্বপূর্ণ যে বেশিরভাগ ভাষাগুলির কাছে সেগুলি না থাকায় বাস্তবে কেবল সেগুলি থাকে। সি # এবং জাভাতে রেফারেন্সের ধরণগুলি মূলত শক্ত বস্তু হিসাবে ছদ্মবেশী পয়েন্টার।

এখন, পয়েন্টার ম্যানিপুলেশন ( p++একটি পয়েন্টারে, বা p += delta) পুরো 'নটর গল্প'। কিছু লোক এটিকে বিপজ্জনক বলে মনে করেন, কিছু লোক মনে করেন এটি দুর্দান্ত। তবে এটি আপনার প্রশ্ন থেকে আরও দূরে।


1

পয়েন্টারগুলি দ্রুততর হতে পারে এবং ডেটা স্ট্রাকচারে এবং প্রোগ্রামের প্রয়োগের পদাঙ্কটি নীচে রেখে উভয়ই কম ওভারহেড ব্যয় করতে পারে। (দয়া করে 'ক্যান' শব্দটি নোট করুন))

সাধারণভাবে নিয়মটি হ'ল, যদি আপনি কোনও নিজস্ব বরাদ্দ সম্পাদন করে বা আপনার পক্ষ থেকে কিছু করার মাধ্যমে কোনও সংস্থান বরাদ্দ করে থাকেন তবে তা হয়ে গেলে তা ছেড়ে দেওয়া আপনার কাজ।

উপরের কাজটির বোঝাটি রানটাইমটি না করে বরং দায়বদ্ধতাটিকে বিকাশকারীকে ফিরিয়ে দেয়। এতে আরও কিছু সুবিধা রয়েছে যে জিনিসগুলি দীর্ঘায়িত হতে পারে, বা সীমানা পেরিয়ে থাকতে পারে, বা আরও উপযুক্ত সময়ে নিষ্পত্তি করা যেতে পারে, বা কোনও আবর্জনা সংগ্রহকারীকে ওজন বহন করার প্রয়োজন নেই।

বহিরাগত ক্ষেত্রে, সাধারণত ব্যাতিক্রম এবং স্কোপ জড়িত থাকে, এমন কয়েকটি প্রান্তের ক্ষেত্রে রয়েছে যা কোডটি ক্লিনআপটি পরিহার করে যদি এড়ানো যায় তবে কিছুটা বেশি সতর্ক হওয়া দরকার। বাস্তবিকভাবে, এই কেসগুলি চারপাশে নকশা করা যেতে পারে। আমরা বহু দশক ধরে পরিচালিত কোড ব্যতীত বেঁচে ছিলাম।

প্রায়শই পয়েন্টারগুলিকে কী "শক্ত" করে তোলে তা কেবল হার্ডওয়্যার স্তরে কী চলছে তা বোঝা যায় না। এটা ইন্ডিয়ারেশন ছাড়া আর কিছুই নয়।

পয়েন্টারগুলি আপনাকে আরও অনেকগুলি কাঁচা অ্যাক্সেস দেয় এবং এটি খুব সহায়ক, চতুর বা প্রয়োজনীয় হতে পারে। আপনি যে কোনও জায়গায় ইঙ্গিত করতে পারেন এবং এটিকে যেকোন কিছু হিসাবে চিকিত্সা করতে পারেন। যদি আপনি নিজের Godশ্বরের মতো শক্তিগুলি ভাল ব্যবহার করেন তবে এটি খুব, খুব ভাল।

কোন দিকটি প্রকাশ করতে ভুলে যাওয়া, বা একাধিকবার প্রকাশের মাধ্যমে, বা প্রকাশের পরে কিছু উল্লেখ করে বা আপনি কোথাও নির্দেশ না দিলে কোনও জিনিস পুনরায় ফিরিয়ে দেওয়ার মাধ্যমে সাধারণত কোণটি নষ্ট হয়। এই জিনিসগুলি প্রায়শই দর্শনীয় ক্রাশগুলির ফলাফল করে এবং সত্য কথা বলতে সাধারণত ইঙ্গিত দেওয়া হয় যে আপনি পয়েন্টারগুলি ভঙ্গুর না করে বরং যুক্তিযুক্ত সমস্যা পেয়েছেন।

আপনি যদি কোনও দৃ develop় বিকাশকারী হন তবে পয়েন্টার ব্যবহার করা অন্য কোনও ডেটা স্ট্রাকচারের চেয়ে বেশি সমস্যাযুক্ত হওয়া উচিত নয়। আবার, এটি রকেট বিজ্ঞান নয়, এবং কয়েক দশক ধরে লোকেরা চোখের জলও ছাড়াই এটি করে। এই দিনগুলিতে এটি কেবলমাত্র কম পড়া যায়।

যা কিছু বলেছে, যদি না আপনার পয়েন্টারের প্রয়োজন হয়, তবে ভাল আবর্জনা সংগ্রহের সরবরাহকারী বাহ্যিক এবং বহিরাগত ক্ষেত্রে পরিচালিত পরিবেশে কাজ করা বেশ উত্তম। কিছু স্মৃতি অর্জন করতে, এটি ব্যবহার করতে এবং এটিকে ত্যাগ করতে সক্ষম হওয়ায় এটি জেনে যায় যে কিছু সময় পরে, এটি যদি বোধগম্য হয় তবে তা ফেলে দেওয়া হবে। কোডারের অংশে এটি কিছুটা কম কোড, একটি রানটাইমের বিনিময়ে কিছু অতিরিক্ত উত্তোলন করে।


0

সেরা উত্তরটি আসলে প্রশ্নের মধ্যে অন্তর্ভুক্ত রয়েছে: পয়েন্টারগুলি নিম্ন-স্তরের প্রোগ্রামিংয়ের জন্য। মঞ্জুর, আপনি সি ব্যবহার করছেন, পয়েন্টার ব্যবহার না করা আপনার পিছনে পিছনে একটি হাত বাঁধা প্রোগ্রামিংয়ের মত, তবে এর উত্তরটি পরিবর্তে উচ্চ স্তরের ভাষা ব্যবহার করা।


-1

পয়েন্টারগুলি মেশিনে একটি দৃশ্যমানতা সরবরাহ করে যা সবচেয়ে আকর্ষণীয় প্রোগ্রামিংয়ের জন্য প্রয়োজনীয়। বেশিরভাগ আধুনিক ভাষাগুলি কেবল আপনার কাছ থেকে কৌতুকপূর্ণ বিটগুলি লুকায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.