কোন প্রোগ্রামিং সমস্যাগুলি পয়েন্টার ব্যবহার করে সবচেয়ে ভাল সমাধান করা হয়? [বন্ধ]


58

ঠিক আছে, আমি মূলত পয়েন্টারগুলি কীভাবে ব্যবহার করতে হয় তা বুঝতে পারি তবে আরও ভাল প্রোগ্রামিং করার জন্য কীভাবে সেগুলি ব্যবহার করা যায় তা সেরা নয়।

পয়েন্টার ব্যবহারের সাথে জড়িত সমাধানের জন্য ভাল প্রকল্প বা সমস্যাগুলি কী কী যাতে আমি আরও ভাল বুঝতে পারি?


কোন প্রোগ্রাম / প্রোগ্রামগুলি নয়, কোন প্রোগ্রামিং সমস্যাগুলি পয়েন্টার ব্যবহার করে সবচেয়ে ভাল সমাধান করা হয় তা সম্পর্কে জিজ্ঞাসা করুন। আপনি পয়েন্টার ব্যবহার করে একটি প্রোগ্রাম লিখতে পারেন বা না - এটি (প্রকল্পগুলি) অর্থবহ উত্তরের জন্য খুব বড় আকারের নির্মাণ const
ওপড

37
প্রোগ্রামিং সমস্যাগুলি পয়েন্টার ব্যবহার করে তৈরি করা হয়, সমাধান করা হয়নি। :)
এক্সপিডি

4
আসলে, আমি আশ্চর্য হয়েছি যে কোন সমস্যা বিন্দু ছাড়াই সমাধান করা যায়। নিশ্চিতভাবে খুব কম।
ডেডালনিক্স

4
@ ডিডালনিক্স, এটি আপনার সুস্পষ্ট পয়েন্টার বা অন্তর্নিহিত পয়েন্টার বলতে চাইলে এটি নির্ভর করে। যদি আপনি বোঝানো ইঙ্গিত পয়েন্টার (অর্থাত্ কোথাও পয়েন্টার ব্যবহার করা হয়), তবে স্ট্যাক বা হিপ ব্যবহার করে এমন কোনও প্রোগ্রাম লেখা অসম্ভব। যদি আপনি সুস্পষ্ট পয়েন্টার বলতে চাইছেন তবে আপনি অনিয়ন্ত্রিত, আপনি নতুন স্ট্যাক ফ্রেম তৈরি করে (মূলত একটি ফাংশন কল ব্যবহার করে) এবং টেল কলগুলি ব্যবহার করে ডিওলোকেশন করে যেকোন আকারের বরাদ্দ করতে পারেন, ধরে নিয়েছেন যে তারা সংকলকটি অপ্রয়োজনীয় ized
ড্যান_ওয়াটারওয়ার্থ

3
হ্যাঁ, এই উত্তরগুলির কয়েকটি ভয়াবহ।

উত্তর:


68

মেমরিতে প্রচুর পরিমাণে ডেটা ম্যানিপুলেট করা হয় যেখানে পয়েন্টারগুলি সত্যই জ্বলে।

রেফারেন্স সহ একটি বৃহত অবজেক্টটি পাস করা কেবল একটি সরল পুরানো সংখ্যাটি পেরিয়ে যাওয়ার সমতুল্য। কোনও বস্তু অনুলিপি করার পরিবর্তে, পরিবর্তিত করে, তারপরে মূলটির জায়গায় রাখার জন্য অনুলিপিটি পাস করার বিপরীতে আপনি প্রয়োজনীয় অংশগুলি সরাসরি পরিচালনা করতে পারেন।


12
এটি একটি দুর্দান্ত উত্তর এবং আমি যুক্ত করব যে বিপুল পরিমাণে ডেটা ম্যানিপুলেট করার জন্য আপনার বড় আকারের জিনিসগুলির প্রয়োজন হবে না; মাঝেমধ্যে বড় বড় অবজেক্টগুলিকে ম্যানিপুলেট করা এটি করে দেবে, তবে আরও সাধারণ সমস্যা হ'ল সত্যিই ঘন ঘন ছোট ছোট বস্তুগুলির হস্তক্ষেপ ip কোনটি যদি আপনি এটির বিষয়ে চিন্তা করেন তবে তা কেবল সমস্ত কম্পিউটার প্রোগ্রাম সম্পর্কে।
জোকিং করা

44

পয়েন্টার ধারণা আপনাকে তথ্য সংরক্ষণের সদৃশ ছাড়াই ঠিকানার মাধ্যমে ডেটা উল্লেখ করতে দেয়। এই পদ্ধতির দক্ষ আলগোরিদিম যেমন লেখার অনুমতি দেয়:

  1. বাছাইকরণ
    যখন বাছাই করা অ্যালগরিদমে ডেটা সরানোর সময় আপনি নিজেই ডেটার পরিবর্তে পয়েন্টারটি সরিয়ে নিতে পারেন - 100 টি অক্ষরের স্ট্রিংয়ে কয়েক মিলিয়ন সারি বাছাই করার কথা ভাবেন; আপনি প্রচুর অপ্রয়োজনীয় ডেটা মুভমেন্টগুলি সংরক্ষণ করেন।

  2. লিঙ্কযুক্ত তালিকাগুলি
    আপনি পরবর্তী এবং / বা পূর্ববর্তী আইটেমের অবস্থানটি সংরক্ষণ করতে পারবেন এবং রেকর্ডের সাথে সম্পর্কিত পুরো ডেটা নয়।

  3. প্যারামিটারগুলি
    পাস করার ক্ষেত্রে এই ক্ষেত্রে, আপনি নিজেই ডেটাটির পরিবর্তে ডেটার ঠিকানাটি পাস করেন। আবার, এমন একটি নাম সংক্ষেপণ অ্যালগরিদম চিন্তা করুন যা কয়েক মিলিয়ন সারিতে চলে।

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

উদাহরণগুলি অনেক জায়গায় পাওয়া যায় যেমন:

নিম্নলিখিত পোস্টটি কোনও উপায়ে প্রাসঙ্গিক হতে পারে:


14
আমি বলব না যে সি # পয়েন্টার ব্যবহারকে উত্সাহ দেয় না; পরিবর্তে, এটা ব্যবহার উৎসাহিত করে না অপরিচালিত পয়েন্টার - সেখানে C # উপাদান প্রচুর প্রায় পরিবর্তে রেফারেন্স মান দ্বারা গৃহীত পরার আছে।
ব্লেকোমেন

দুর্দান্ত এক, ভাল ব্যাখ্যা
সাব্বি

5
সি # মন্তব্যের জন্য ডাউনভোট করতে হয়েছিল। সি # "রেফারেন্স" পয়েন্টারগুলির সমতুল্য, এটি ঠিক যে সি # আপনাকে জেনে রাখা দূরে রাখে যে সত্যিকার অর্থে আপনি কেবল পরিচালিত হিপগুলিতে কোনও পয়েন্টারের সাথে কাজ করছেন।
ম্যাটডেভি

1
@ ম্যাটড্যাভি: সি # রেফারেন্সগুলি পয়েন্টার নয়। আপনি এগুলি থেকে যোগ করতে পারবেন না, এগুলিকে একটি অ্যারে সূচীতে ব্যবহার করতে পারেন, একাধিক দিকনির্দেশ ব্যবহার করতে পারেন, উদাহরণস্বরূপ আপনার রেফারেন্সের রেফারেন্স থাকতে পারে না।
বিলি ওনিল

5
@ বিলি ওনিল এই ধারণাটি প্রকাশ করেছেন যে "আপনি যদি গাণিতিক করতে পারেন তবে এটি কেবলমাত্র পয়েন্টার" খোলামেলা হাস্যকর, তবে আপনার সাথে তর্ক করার ধৈর্য আমার নেই।
ম্যাটডেভি

29

আমি আশ্চর্য হয়েছি যে অন্য কোনও উত্তরের এটি উল্লেখ করা হয়নি: পয়েন্টারগুলি আপনাকে অ-সামঞ্জস্যপূর্ণ এবং অ-রৈখিক ডেটা স্ট্রাকচার তৈরি করতে দেয়, যার মধ্যে কোনও উপাদান জটিল উপায়ে একাধিক অন্যের সাথে সম্পর্কিত হতে পারে।

লিঙ্কযুক্ত তালিকাগুলি (এককভাবে, দ্বিগুণ এবং বৃত্তাকার সাথে সংযুক্ত), গাছ (লাল-কালো, এভিএল, ট্রাই, বাইনারি, স্পেস পার্টিশন ...) এবং গ্রাফগুলি হ'ল কাঠামোগুলির উদাহরণ যা কেবলমাত্র মানগুলির চেয়ে রেফারেন্সের ক্ষেত্রে সবচেয়ে প্রাকৃতিকভাবে নির্মিত যেতে পারে are ।


আপনি XOR লিঙ্কযুক্ত তালিকাটি ভুলে যাচ্ছেন [=
ড্যান_ওয়াটারওয়ার্থ

@ উদ্যান_ ওয়াটারওয়ার্থ: না, আমি জানি না কালো যাদুটি খুব ভাল।
জন পুর্ডি

8

একটি সহজ উপায় Polymorphism হয়। পলিমারফিজম কেবল পয়েন্টারগুলির সাথে কাজ করে।

এছাড়াও, আপনি গতিশীল মেমরি বরাদ্দ প্রয়োজন যে কোনও সময় পয়েন্টার ব্যবহার। সি-তে সাধারণত এটি ঘটে যখন আপনার কোনও অ্যারেতে ডেটা সংরক্ষণ করতে হবে তবে সংকলনের সময় আপনি আকারটি জানেন না। তারপরে আপনি মেমোরি এবং এটিতে অ্যাক্সেসের জন্য একটি পয়েন্টার বরাদ্দ করতে malloc কল করবেন। এছাড়াও, আপনি এটি জানেন বা না জানেন, আপনি যখন বিন্যাস ব্যবহার করছেন তখন আপনি পয়েন্টার ব্যবহার করছেন।

for(int i = 0; i < size; i++)
   std::cout << array[i];

এর সমতুল্য

for(int i = 0; i < size; i++)
   std::cout << *(array + i);

এই জ্ঞান আপনাকে সত্যিই দুর্দান্ত জিনিসগুলি করতে দেয় যেমন একটি লাইনে পুরো অ্যারে অনুলিপি করে:

while( (*array1++ = *array2++) != '\0')

সি ++ এ আপনি কোনও অবজেক্টের জন্য মেমরি বরাদ্দ করতে এবং এটি একটি পয়েন্টারে সঞ্চয় করতে নতুন ব্যবহার করেন। আপনি কম্পাইল সময়ের পরিবর্তে রান-টাইমের সময় কোনও অবজেক্ট তৈরি করার সময় এটি করুন (অর্থাত কোনও পদ্ধতি একটি নতুন বস্তু তৈরি করে এবং এটি একটি তালিকায় রাখে)।

পয়েন্টারগুলি আরও ভালভাবে বুঝতে:

  1. Projectsতিহ্যবাহী সি-স্ট্রিং এবং অ্যারে দিয়ে ঘুরে বেড়ানো এমন কিছু প্রকল্প সন্ধান করুন।
  2. উত্তরাধিকার ব্যবহার করে এমন কিছু প্রকল্প সন্ধান করুন।

  3. আমি আমার দাঁত কাটা এই প্রকল্পটি এখানে:

একটি ফাইল থেকে দুটি এনএক্সএন ম্যাট্রিক পড়ুন এবং সেগুলিতে প্রাথমিক ভেক্টর স্পেস ক্রিয়াকলাপ সম্পাদন করুন এবং তাদের ফলাফলটি স্ক্রিনে মুদ্রণ করুন।

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


2
"পলিমারফিজম কেবল পয়েন্টারগুলির সাথে কাজ করে।" সঠিক নয়: বহুবর্ষ এছাড়াও রেফারেন্স সহ কাজ করে। যা শেষ পর্যন্ত পয়েন্টার, তবে আমি মনে করি পার্থক্যটি গুরুত্বপূর্ণ, বিশেষত নতুনদের কাছে to
লরেন্ট পাইরেইন

এক লাইনে অ্যারে অনুলিপি করার জন্য আপনার উদাহরণটি হ'ল কোনও লাইনে শূন্য-সমাপ্ত স্ট্রিংটি অনুলিপি করার জন্য, কোনও সাধারণ অ্যারে নয়।
tcrosley

8

পয়েন্টার কেন গুরুত্বপূর্ণ তা বোঝার জন্য আপনাকে গাদা বরাদ্দ এবং স্ট্যাক বরাদ্দের মধ্যে পার্থক্য বুঝতে হবে।

নীচে স্ট্যাক বরাদ্দের উদাহরণ:

struct Foo {
  int bar, baz
};

void foo(void) {
  struct Foo f;
}

স্ট্যাক বরাদ্দ করা অবজেক্টগুলি কেবল বর্তমান ফাংশন সম্পাদনের সময়কালের জন্য বিদ্যমান exist কলটি যখন fooসুযোগের বাইরে চলে যায় তখন চলকটি হয় f

আপনি যখন কোনও ফাংশন থেকে অবিচ্ছেদ্য ধরণের ব্যতীত অন্য কোনও কিছু ফেরত নিতে চান তখন একটি সমস্যা এটি হয়ে যায় (উদাহরণস্বরূপ উপরের উদাহরণ থেকে ফু কাঠামো) oo

উদাহরণস্বরূপ, নিম্নলিখিত ফাংশনটির ফলে তথাকথিত "অপরিজ্ঞাত আচরণ" হবে in

struct Foo {
  int bar, baz
};

struct Foo *foo(void) {
  struct Foo f;
  return &f;
}

আপনি যদি struct Foo *কোনও ফাংশন থেকে এমন কিছু ফিরিয়ে দিতে চান যা আপনার সত্যিই প্রয়োজন তা হ'ল একটি বরাদ্দ:

struct Foo {
  int bar, baz
};

struct Foo *foo(void) {
  return malloc(sizeof(struct Foo));
}

ফাংশনটি mallocহিপগুলিতে একটি বস্তু বরাদ্দ করে এবং সেই বস্তুকে একটি পয়েন্টার দেয় returns নোট করুন যে "অবজেক্ট" শব্দটি এখানে lyিলে .ালাভাবে ব্যবহৃত হয়, যার অর্থ বস্তু-ভিত্তিক প্রোগ্রামিংয়ের অর্থে অবজেক্টের চেয়ে "কিছু"।

হিপ-বরাদ্দ হওয়া সামগ্রীর আজীবন প্রোগ্রামার দ্বারা নিয়ন্ত্রিত হয়। প্রোগ্রামার এটিকে মুক্ত না করা, অর্থাত্ ফোন করে free()বা প্রোগ্রামটি প্রস্থান না হওয়া অবধি এই অবজেক্টের স্মৃতি মজুদ থাকবে।

সম্পাদনা : আমি এই প্রশ্নটি C ++ প্রশ্ন হিসাবে ট্যাগ করা আছে তা লক্ষ্য করতে ব্যর্থ হয়েছি। সি ++ অপারেটর newএবং new[]একই ফাংশন সম্পাদন করে malloc। অপারেটরগুলি deleteএবং delete[]এর সাথে সাদৃশ্যপূর্ণ free। যদিও newএবং deleteসি ++ অবজেক্টগুলি বরাদ্দ এবং বিনামূল্যে করার জন্য একচেটিয়াভাবে ব্যবহার করা উচিত, তবে সি ++ কোডে ব্যবহার mallocএবং freeএটি পুরোপুরি আইনী।


1
(+1) এছাড়াও "স্ট্যাটিক বরাদ্দ ভেরিয়েবল" এবং "গতিশীল বরাদ্দ ভেরিয়েবল" ;-)
ইউএমএলক্যাট

4

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

  • একটি ছোট এবং সাধারণ ওয়েব সার্ভার
  • ইউনিক্স কমান্ড লাইন সরঞ্জাম (কম, বিড়াল, বাছাই ইত্যাদি)
  • কিছু আসল প্রকল্প আপনি কেবল নিজের শিক্ষার জন্য নয়, নিজের স্বার্থে করতে চান

আমি সর্বশেষ একটি সুপারিশ।


সুতরাং আমি কেবল একটি প্রকল্প করতে চাই যা করতে চাই (2 ডি গেমের মতো) এবং মনে করা হয় যে আমার প্রয়োজন হবে এবং পয়েন্টারগুলি শিখব?
ডাইসোকো

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

3

পয়েন্টারগুলির সাহায্যে সমাধান করা প্রায় সমস্ত প্রোগ্রামিং সমস্যাগুলি নিরাপদ প্রকারের অন্যান্য রেফারেন্সের সাথে সমাধান করা যেতে পারে ( সি ++ রেফারেন্সের উল্লেখ না করে , তবে ভেরিয়েবল থাকার সাধারণ সিএস ধারণাটি অন্য কোথাও সঞ্চিত ডেটার মানকে বোঝায়)।

রেফারেন্সগুলির নির্দিষ্ট নিম্ন-স্তরের বাস্তবায়ন হয়ে পয়েন্টারগুলি , যেখানে আপনি সরাসরি মেমরির ঠিকানাগুলি পরিচালনা করতে পারেন খুব শক্তিশালী, তবে এটি ব্যবহার করা কিছুটা বিপজ্জনক হতে পারে (উদাহরণস্বরূপ, প্রোগ্রামের বাইরে মেমরির অবস্থানগুলিতে নির্দেশ করুন)।

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

আপনার কেন দিকনির্দেশের প্রয়োজন, সেই তালিকাটি বেশ দীর্ঘ, তবে মূলত দুটি মূল ধারণাটি হ'ল:

  1. বড় বড় অবজেক্টের মানগুলি অনুলিপি করা ধীরে ধীরে এবং বস্তুটি র‍্যামে দু'বার সংরক্ষণ করা হবে (সম্ভাব্যভাবে খুব ব্যয়বহুল), তবে রেফারেন্সের মাধ্যমে অনুলিপিটি কেবল কয়েক বাইটের র্যাম (ঠিকানার জন্য) ব্যবহার করে তাত্ক্ষণিকের নিকটে রয়েছে। উদাহরণস্বরূপ, বলুন যে আপনার কাছে 1000 ডলার বড় অবজেক্ট (প্রতিটি র‌্যামের 1MB র কথা রয়েছে) রয়েছে এবং আপনার ব্যবহারকারীর বর্তমান অবজেক্টটি নির্বাচন করতে সক্ষম হওয়া প্রয়োজন (যা ব্যবহারকারী তার দ্বারা অভিনয় করা হবে)। selected_objectবর্তমানের বস্তুর মান একটি নতুন ভেরিয়েবলে অনুলিপি করার চেয়ে কোনও অবজেক্টের একটি উল্লেখ হিসাবে একটি ভেরিয়েবল থাকা অনেক বেশি কার্যকর।
  2. জটিল তথ্য কাঠামো থাকা যা লিঙ্কযুক্ত তালিকাগুলি বা গাছের মতো অন্যান্য বস্তুগুলিকে বোঝায়, যেখানে ডেটা স্ট্রাকচারের প্রতিটি আইটেম ডেটা কাঠামোর অন্যান্য আইটেমগুলিকে বোঝায়। ডেটা স্ট্রাকচারের অন্যান্য আইটেমগুলিকে উল্লেখ করার সুবিধার অর্থ হল যে তালিকার মাঝখানে একটি নতুন আইটেম সন্নিবেশ করানোর কারণে আপনাকে তালিকার প্রতিটি আইটেমটি মেমরির আশেপাশে সরাতে হবে না (ধ্রুবক সময় সন্নিবেশ থাকতে পারে)।

2

পিক্সেল স্তরের চিত্রের ম্যানিপুলেশন পয়েন্টার ব্যবহার করে প্রায় সর্বদা সহজ এবং দ্রুত। কখনও কখনও এটি পয়েন্টার ব্যবহার করেই সম্ভব।


1
"কখনও কখনও এটি পয়েন্টার ব্যবহার করেই সম্ভব" বিবৃতিটি সত্য বলে আমি মনে করি না। এমন ভাষা রয়েছে যা বিকাশকারীকে পয়েন্টার প্রকাশ করে না, তবুও সেগুলি একই জায়গাতে সমস্যাগুলি সমাধান করতে ব্যবহার করা যেতে পারে।
টমাস ওপেনস

সম্ভবত ... আমার কাছে সমস্ত উপলভ্য ভাষা সম্পর্কে জ্ঞান নেই তবে আমি অবশ্যই কোনও পয়েন্টার না থাকায় একটি ভাষা ব্যবহার করে কোনও চিত্রে কনভলিউশন ফিল্টার প্রয়োগ করতে একটি রুটিন লিখতে চাই না।
ডেভ নায়

@ থমাস, আপনি যখন সঠিক, প্রশ্নটি সি ++ সম্পর্কে যা বিকাশকারীকে পয়েন্টার প্রকাশ করে।
জোনাথন হেনসন

@ জোনাথন তবুও, যদি আপনি এমন কোনও ভাষায় সমস্যা সমাধান করতে পারেন যা পয়েন্টারগুলি প্রকাশ না করে তবে পয়েন্টার ব্যবহার না করে পয়েন্টারকে প্রকাশ করে এমন ভাষায় সমস্যাটি সমাধান করাও সম্ভব। এটি প্রথম বাক্যটিকে সত্য করে তোলে, তবে দ্বিতীয় বাক্যটি মিথ্যা করে - সেখানে (আমার জ্ঞানের সেরা দিক থেকে) কোনও সমস্যা নেই যা পয়েন্টার ব্যবহার না করে সমাধান করা যায় না।
টমাসের মালিক

1
বিপরীতে, চিত্র প্রক্রিয়াকরণে প্রায়শই "সমন্বিত গাণিতিক" জড়িত - বলে, একটি কোণের সাইন এবং কোসাইন নিয়ে এবং এটি x- এবং y- স্থানাঙ্কের সাথে গুণ করে। অন্যান্য ক্ষেত্রে মোড়কের চারপাশে বা সীমানার বাইরে পিক্সেলের প্রতিরূপ প্রয়োজন। এই অর্থে, পয়েন্টার গাণিতিকটি বরং অপর্যাপ্ত।
rwong

1

পয়েন্টারগুলি পৃষ্ঠার নীচে এতগুলি প্রোগ্রামিং ভাষায় ব্যবহার করে এটি সম্পর্কে ব্যবহারকারীকে ত্রুটিযুক্ত না করে। সি / সি ++ কেবল সেগুলিতে আপনাকে অ্যাক্সেস দেয়।

এগুলি কখন ব্যবহার করবেন: যতবার সম্ভব সম্ভব হয়, কারণ তথ্য অনুলিপি করা অদক্ষ। কখন সেগুলি ব্যবহার করবেন না: যখন আপনি দুটি অনুলিপি চান যা পৃথকভাবে পরিবর্তন করা যায়। (মূলত অবজেক্ট_1 এর সামগ্রীটি মেমোরির অন্য কোনও জায়গায় অনুলিপি করে এবং কোনও পয়েন্টার ফিরিয়ে দেবে - এবার অবজেক্ট ৩-এ নির্দেশ করবে)


1

সিতে যে কোনও ডেটা স্ট্রাকচার বাস্তবায়নের জন্য পয়েন্টারগুলি একটি অপরিহার্য অঙ্গ এবং ডেটা স্ট্রাকচারগুলি কোনও তুচ্ছ প্রোগ্রামের অপরিহার্য অঙ্গ।

যদি আপনি এটি শিখতে চান কেন এটি কেন পয়েন্টারগুলি অতীব গুরুত্বপূর্ণ, তবে আমি যুক্ত লিঙ্কটি কী তা শেখার এবং পয়েন্টারগুলি ব্যবহার না করে একটি লেখার চেষ্টা করার পরামর্শ দেব। আমি আপনাকে একটি অসম্ভব চ্যালেঞ্জ সেট করি নি, (ইঙ্গিত: পয়েন্টারগুলি মেমরির অবস্থানগুলি উল্লেখ করতে ব্যবহৃত হয়, আপনি কীভাবে অ্যারেগুলিতে রেফারেন্স করবেন?)।


ডেটা স্ট্রাকচারের উল্লেখ করার জন্য +1, অ্যালগরিদমে ব্যবহার একটি প্রাকৃতিক পরিণতি।
ম্যাথিউ মিঃ

0

বাস্তব জীবনের উদাহরণ হিসাবে, একটি সীমা অর্ডার বই তৈরি করা।

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


0

স্ট্যাকএক্সচেঞ্জের বিভিন্ন সাইটকে উপলব্ধি করে বুঝতে পারি যে এটি এই জাতীয় প্রশ্ন জিজ্ঞাসা করার পরিবর্তে প্রচলিত। সমালোচনা এবং নিম্নমানের ঝুঁকিতে আমি সৎ হব। এটি ট্রোল বা শিখা বোঝানোর জন্য নয়, আমি কেবল অর্থের সাহায্যের অর্থ, প্রশ্নের একটি সত্যনিষ্ঠ মূল্যায়ন দিয়ে।

এবং সেই মূল্যায়নটি নিম্নরূপ: কোনও সি প্রোগ্রামারকে জিজ্ঞাসা করা এটি খুব আশ্চর্যজনক প্রশ্ন। খুব সুন্দর যা বলা হয় তা হ'ল "আমি সি জানি না" " আমি যদি আরও বিশদভাবে আরও বিশদভাবে বিশ্লেষণ করি তবে এই "প্রশ্ন" এর ফলো-আপ করার একটি প্রতিশ্রুতি রয়েছে: "কোনও সময় ব্যয় না করে দ্রুত এবং হঠাৎ অভিজ্ঞ সি প্রোগ্রামারটির জ্ঞান অর্জন করতে আমি কি কিছু শর্টকাট নিতে পারি? স্বাধীন অধ্যয়নের জন্য? " যে কোনও "উত্তর" যে কেউ দিতে পারে তা অন্তর্নিহিত ধারণা এবং এর ব্যবহার বোঝার জন্য লেগ ওয়ার্কে যাওয়ার এবং করার বিকল্প নেই।

আমার মনে হচ্ছে ওয়েবে গিয়ে লোকেদের এটি জিজ্ঞাসা করার চেয়ে প্রথমে সি ভালভাবে শিখতে আরও গঠনমূলক। আপনি যখন সি সম্পর্কে ভাল জানেন তখন আপনি এই জাতীয় প্রশ্ন জিজ্ঞাসা করবেন না, এমন প্রশ্ন করার মতো হবে "দাঁত ব্রাশ ব্যবহার করে কোন সমস্যাগুলি সবচেয়ে ভাল সমাধান করা হয়?"


0

যদিও বড় মেমোরি অবজেক্টের সাথে কাজ করার সময় পয়েন্টারগুলি সত্যই জ্বলজ্বল করে, এগুলি ছাড়া এখনও এটি করার একটি উপায় রয়েছে।

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

যতক্ষণ আপনি রানটাইমের সময় নির্দিষ্ট মেমরির দাবি করতে পারবেন এবং আপনার ডেটা সদ্য অর্জিত স্মৃতিতে স্থাপন করতে পারেন তারপরে নিম্নলিখিতটি করতে পারেন:

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

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


0

মজাদার, আমি স্রেফ C ++ সম্পর্কে একটি প্রশ্নের উত্তর দিয়েছি এবং পয়েন্টারগুলির বিষয়ে কথা বলেছি।

সংক্ষিপ্ত সংস্করণ হ'ল আপনি পয়েন্টার প্রয়োজন নেই যদি না 1) আপনি যে লাইব্রেরি ব্যবহার করছেন তা আপনাকে বাধ্য করে 2) আপনার একটি অযোগ্য রেফারেন্স প্রয়োজন।

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

আপনার প্রশ্নের উত্তর এই অংশে দেওয়া যেতে পারে

আপনি যদি কোনও পয়েন্টার ব্যবহার করেন তবে নিশ্চিত হয়ে নিন যে এটি দুটি শর্তের মধ্যে একটিতে রয়েছে। 1) আপনি ইনপুট পাস করছেন যা অযোগ্য হতে পারে। একটি উদাহরণ optionচ্ছিক ফাইলের নাম। 2) আপনি মালিকানা দূরে দিতে চান। আপনি যদি পয়েন্টারটি পাস বা ফিরিয়ে দেন তবে আপনার কাছে এর কোনও অনুলিপি নেই বা আপনি যে পয়েন্টারটি দিয়েছেন তা ব্যবহার করেন না

ptr=blah; func(ptr); //never use ptr again for here on out.

তবে আমি খুব দীর্ঘ সময়ের জন্য পয়েন্টার বা স্মার্ট পয়েন্টার ব্যবহার করি নি এবং আমি আমার অ্যাপ্লিকেশনটি প্রোফাইল করেছি। এটি খুব দ্রুত চলে।

অতিরিক্ত নোট: আমি লক্ষ্য করেছি যে আমি নিজের স্ট্রাক্টগুলি লিখি এবং আমি সেগুলি প্রায় পাশ করে দিয়েছি। সুতরাং আমি কীভাবে পয়েন্টার ব্যবহার না করে এটি করব? এটি কোনও এসটিএল কনটেইনার নয় তাই রেফের মধ্য দিয়ে যাওয়া ধীর is আমি সর্বদা আমার ডেটা তালিকা / ডিউক / মানচিত্র এবং এ জাতীয় লোড করি। আমি মনে করি না যে কোনও বস্তু ফিরিয়ে দেওয়া যদি না তা কোনও ধরণের তালিকা / মানচিত্র না থাকে। একটি স্ট্রিংও নয়। আমি একক বস্তুর কোডের দিকে নজর দিয়েছি এবং আমি লক্ষ্য করছি যে আমি এরকম কিছু করি { MyStruct v; func(v, someinput); ... } void func(MyStruct&v, const D&someinput) { fillV; }যাতে আমি বেশিরভাগ রিটার্ন অবজেক্ট (একাধিক) বা প্রিললোকট / পাস করার জন্য একটি রেফারেন্সে (একক) পাস করি।

এখন আপনি যদি নিজের ডিউক, মানচিত্র ইত্যাদি লিখতেন তবে আপনাকে পয়েন্টার ব্যবহার করতে হবে। তবে আপনার দরকার নেই। এসটিএল এবং সম্ভবত এটি সম্পর্কে উদ্বেগ বাড়িয়ে দিন। আপনার কেবল ডেটা এবং সমাধানগুলি লিখতে হবে। তাদের ধরে রাখার জন্য ধারক নয়;)

আমি আশা করি আপনি এখন পয়েন্টার ব্যবহার করবেন না: ডি। সৌভাগ্য যে libs যে আপনি বাধ্য


0

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


0

আমি পয়েন্টারগুলিকে আমার তর্জনী হিসাবে দেখছি, আমরা কয়েকটি জিনিস করতে ব্যবহার করি:

  1. যখন কেউ আপনাকে এমন কিছু জিজ্ঞাসা করে যা আপনি বহন করতে পারবেন না, যেমন রাস্তাটি কোথায় থাকে এবং তাই আমি এই রাস্তায় "পয়েন্ট" করব এবং রেফারেন্সের মাধ্যমে যুক্তির ক্ষেত্রে আমরা এটিই করি
  2. গণনা করার সময় বা কোনও কিছুতে ট্র্যাভার করার সময় আমরা একই আঙুলটি ব্যবহার করতাম এবং অ্যারেতে আমরা এটিই করি

দয়া করে এই খারাপ উত্তরটি ক্ষমা করুন


0

আপনার প্রশ্নটি যেমন সি ++ ট্যাগ করা আছে, আমি সেই ভাষার জন্য আপনার প্রশ্নের উত্তর দেব।

সি ++ তে পয়েন্টার এবং রেফারেন্সের মধ্যে পার্থক্য রয়েছে, সুতরাং দুটি পরিস্থিতি রয়েছে যেখানে নির্দিষ্ট আচরণগুলির সুবিধার্থে পয়েন্টার (বা স্মার্ট পয়েন্টার) প্রয়োজন। এগুলি অন্যান্য পরিস্থিতিতে ব্যবহার করা যেতে পারে, তবে আপনি কীভাবে "এগুলি ব্যবহারের সেরা" জিজ্ঞাসা করেন এবং অন্য সমস্ত পরিস্থিতিতে আরও ভাল বিকল্প রয়েছে।

1. পলিমারফিজম

একটি বেস ক্লাস পয়েন্টার আপনাকে একটি ভার্চুয়াল পদ্ধতিতে কল করতে দেয় যা পয়েন্টারটি নির্দেশ করে এমন বস্তুর ধরণের উপর নির্ভর করে।

২. অবিরাম অবজেক্ট তৈরি করা

গতিশীলভাবে কোনও বস্তু তৈরি করার সময় পয়েন্টারগুলি প্রয়োজনীয় (স্ট্যাকের পরিবর্তে গাদা)। এটি যখন প্রয়োজনীয় আপনি যখন চান যে অবজেক্টগুলি আজীবন এটি তৈরির সুযোগের চেয়ে দীর্ঘ হয়।

"ভাল প্রকল্প বা সমাধানের জন্য সমস্যাগুলির" শর্তাবলী হিসাবে, অন্যরা এখানে ইতিমধ্যে বলেছে যে, কোনও তুচ্ছ-তুচ্ছ প্রকল্প পয়েন্টার ব্যবহার করবে।


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