কেন বৃদ্ধি পয়েন্টার?


25

আমি সম্প্রতি সি ++ শিখতে শুরু করেছি এবং বেশিরভাগ লোক হিসাবে (আমি যা পড়ছি তা অনুসারে) আমি পয়েন্টারগুলির সাথে লড়াই করছি।

প্রচলিত অর্থে নয়, আমি বুঝতে পারি যে সেগুলি কী, এবং সেগুলি কেন ব্যবহৃত হয় এবং কীভাবে তারা কার্যকর হতে পারে তবে আমি বুঝতে পারি না যে ইনক্রিমেন্টিং পয়েন্টারগুলি কীভাবে কার্যকর হবে, কেউ কীভাবে পয়েন্টার বৃদ্ধিকরণের একটি ব্যাখ্যা প্রদান করতে পারে দরকারী ধারণা এবং প্রতিচ্ছবি সি ++?

এই প্রশ্নটি আমি বার্জন স্ট্রোস্ট্রপের A ট্যুর অফ সি ++ বইটি পড়া শুরু করার পরে এসেছিল , আমার এই বইটি সুপারিশ করা হয়েছিল, কারণ আমি জাভার সাথে বেশ পরিচিত, এবং রেডডিট-এর লোকেরা আমাকে বলেছিল যে এটি একটি ভাল 'সুইচওভার' বই হবে ।


11
পয়েন্টারটি কেবল একটি পুনরাবৃত্তি
চার্লস সালভিয়া

1
কম্পিউটার ভাইরাস লেখার জন্য এটি অন্যতম প্রিয় সরঞ্জাম যা তাদের পড়া উচিত নয় তা পড়ে। এটি অ্যাপ্লিকেশনগুলির দুর্বলতার সবচেয়ে সাধারণ ক্ষেত্রে একটি (যখন কোনও ব্যক্তি যখন তাদের অনুমিত ক্ষেত্রের পাশের একটি পয়েন্টার বৃদ্ধি করে, তখন এটি পড়তে বা লেখার জন্য)> হার্টব্লিড বাগটি দেখুন।
স্যাম

1
@ বাসাইল এটি পয়েন্টার সম্পর্কে খারাপ
ক্রুঙ্কার

4
সি ++ সম্পর্কে সুন্দর / খারাপ জিনিসটি হ'ল এটি আপনাকে সেগফল্ট কল করার আগে আরও অনেক কিছু করতে দেয়। অন্য কোনও প্রক্রিয়ার মেমরি, সিস্টেম মেমরি বা সুরক্ষিত অ্যাপ্লিকেশন মেমরি অ্যাক্সেস করার চেষ্টা করার সময় সাধারণত আপনি সেগফল্ট পান। সাধারণ অ্যাপ্লিকেশন পৃষ্ঠাগুলির অভ্যন্তরে যে কোনও অ্যাক্সেস সিস্টেমের দ্বারা অনুমোদিত এবং যুক্তিসঙ্গত সীমাবদ্ধতা প্রয়োগ করার জন্য এটি প্রোগ্রামার / সংকলক / ভাষার নীচে। সি ++ আপনাকে যা কিছু করতে চান তা করতে দেয়। যেমন ওপেনসেলের নিজস্ব মেমরি ম্যানেজার রয়েছে - এটি সত্য নয়। এটিতে কেবল ডিফল্ট সি ++ মেমরি অ্যাক্সেস প্রক্রিয়া রয়েছে।
স্যাম

1
@ আইএনডেক: আপনি কেবলমাত্র সেগফল্ট পাবেন যদি আপনি অ্যাক্সেস করার চেষ্টা করছেন মেমরিটি সুরক্ষিত থাকে। বেশিরভাগ অপারেটিং সিস্টেমগুলি পৃষ্ঠার স্তরে সুরক্ষা দেয়, যাতে আপনি সাধারণত যে পৃষ্ঠায় আপনার পয়েন্টার শুরু হয় তাতে যে কোনও কিছু অ্যাক্সেস করতে পারেন। যদি ওএস কোনও 4K পৃষ্ঠার আকার ব্যবহার করে, তবে এটি যথেষ্ট পরিমাণে ডেটা। যদি আপনার পয়েন্টারটি গাদা কোথাও থেকে শুরু হয়, তবে আপনি কতটা ডেটা অ্যাক্সেস করতে পারবেন তা কারও অনুমান।
টিএমএন

উত্তর:


46

আপনার যদি অ্যারে থাকে, আপনি অ্যারের কোনও উপাদানকে নির্দেশ করতে একটি পয়েন্টার সেটআপ করতে পারেন:

int a[10];
int *p = &a[0];

এখানে pপ্রথম উপাদানটি নির্দেশ করে a, যা a[0]। এখন আপনি পরবর্তী উপাদানটি নির্দেশ করতে পয়েন্টারটি বাড়িয়ে তুলতে পারেন:

p++;

এখন pদ্বিতীয় উপাদান নির্দেশ করে a[1],। আপনি এখানে ব্যবহার করে উপাদান অ্যাক্সেস করতে পারেন *p। এটি জাভা থেকে আলাদা যেখানে আপনাকে অ্যারের উপাদানগুলিতে অ্যাক্সেস করতে ইন্টিজার ইনডেক্স ভেরিয়েবল ব্যবহার করতে হবে।

সি পয়েন্টার ++, যেখানে যে পয়েন্টার নেই বৃদ্ধিশীল না একটি অ্যারের একটি উপাদান নির্দেশ হল অনির্ধারিত আচরণ


23
হ্যাঁ, সি ++ সহ আপনি প্রোগ্রামিং ত্রুটিগুলি যেমন অ্যারের সীমানার বাইরে অ্যাক্সেস এড়ানোর জন্য দায়বদ্ধ।
গ্রেগ হিউগিল

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

4
কয়েকটি জিনিস রয়েছে যা অ্যারে হিসাবে বা এর সাথে চিকিত্সা করা যেতে পারে; পাঠ্যের একটি স্ট্রিং প্রকৃতপক্ষে অক্ষরের একটি অ্যারে। কিছু ক্ষেত্রে, দীর্ঘ ইনটকে বাইটের অ্যারে হিসাবে বিবেচনা করা হয়, যদিও এটি আপনাকে সহজেই সমস্যায় ফেলতে পারে।
আমাদানন ইনক।

6
এটি আপনাকে প্রকারটি বলে , তবে আচরণটি 5..7 সংযোজক অপারেটরগুলিকে [এক্সপ্রেসড্যাড] বর্ণিত হয়েছে। বিশেষত, 5.7 / 5 বলছে যে একের অতীত-শেষ ব্যতীত অ্যারের বাইরে যে কোনও জায়গায় যাওয়া হ'ল ইউবি।
অকেজো

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

37

পয়েন্টার বাড়ানো আইডোমেটিক সি ++, কারণ পয়েন্টার শব্দার্থবিজ্ঞানগুলি সি ++ স্ট্যান্ডার্ড লাইব্রেরির পিছনে নকশা দর্শনের একটি মৌলিক দিক প্রতিফলিত করে (আলেকজান্ডার স্টেপানভের এসটিএল ভিত্তিক )

এখানে গুরুত্বপূর্ণ ধারণাটি হ'ল এসটিএলটি ধারক, অ্যালগরিদম এবং পুনরুক্তিগুলির চারপাশে নকশা করা হয়েছে। পয়েন্টারগুলি কেবল পুনরাবৃত্ত হয়

অবশ্যই পয়েন্টারগুলিকে ইনক্রিমেন্ট করার ক্ষমতা (বা যোগ / বিয়োগ) থেকে আবার সিতে ফিরে যায় সি সি স্ট্রিং ম্যানিপুলেশন অ্যালগরিদমগুলি কেবল পয়েন্টার গাণিতিক ব্যবহার করে লেখা যায়। নিম্নলিখিত কোড বিবেচনা করুন:

char string1[4] = "abc";
char string2[4];
char* src = string1;
char* dest = string2;
while ((*dest++ = *src++));

এই কোডটি নাল-টার্মিনেটেড সি-স্ট্রিং অনুলিপি করতে পয়েন্টার গাণিতিক ব্যবহার করে। শূন্যতার মুখোমুখি হয়ে লুপটি স্বয়ংক্রিয়ভাবে শেষ হয়।

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

একটি উপর পুনরাবৃত্তি করতে std::string, আমরা বলব:

std::string s = "abcdef";
std::string::iterator it = s.begin();
for (; it != s.end(); ++it) std::cout << *it;

আমরা পুনরাবৃত্তিকে বৃদ্ধি করি ঠিক যেমন আমরা একটি সরল সি-স্ট্রিংয়ে একটি পয়েন্টার বৃদ্ধি করি। এই ধারণাটি শক্তিশালী হওয়ার কারণ হ'ল আপনি ফাংশনগুলি লিখতে টেমপ্লেটগুলি ব্যবহার করতে পারেন যা প্রয়োজনীয় ধারণার প্রয়োজনীয়তা পূরণ করে এমন কোনও ধরণের পুনরাবৃত্তির জন্য কাজ করবে । এবং এটি এসটিএল এর শক্তি:

std::string s1 = "abcdef";
std::vector<char> buf;
std::copy(s1.begin(), s1.end(), std::back_inserter(buf));

এই কোডটি একটি ভেক্টরটিতে একটি স্ট্রিং অনুলিপি করে। copyফাংশন যা সঙ্গে কাজ করবে একটি টেমপ্লেট কোনো (যা প্লেইন পয়েন্টার অন্তর্ভুক্ত) পুনরুক্তিকারীর যে সমর্থন বৃদ্ধিশীল। আমরা copyপ্লেইন সি-স্ট্রিংয়ে একই ফাংশনটি ব্যবহার করতে পারি :

   const char* s1 = "abcdef";
   std::vector<char> buf;
   std::copy(s1, s1 + std::strlen(s1), std::back_inserter(buf));

আমরা copyকোনও std::mapবা কোনও std::setবা কোনও কাস্টম ধারক যা পুনরাবৃত্তিকে সমর্থন করে তা ব্যবহার করতে পারি ।

নোট করুন যে পয়েন্টারগুলি একটি নির্দিষ্ট ধরণের পুনরাবৃত্তিকারী: এলোমেলো অ্যাক্সেস পুনরুদ্ধারকারী , যার অর্থ তারা বৃদ্ধি এবং হ্রাস, +এবং -অপারেটরের সাথে অগ্রগতি সমর্থন করে । অন্যান্য পুনরাবৃত্তকারী প্রকারগুলি কেবল পয়েন্টার শব্দার্থবিজ্ঞানের একটি উপসেটকে সমর্থন করে: একটি দ্বিদ্বিদী পুনরুক্তি কমপক্ষে বৃদ্ধি এবং হ্রাসকে সমর্থন করে; একটি ফরোয়ার্ড ইটারেটর কমপক্ষে ইনক্রিমেন্টিং সমর্থন করে। (সমস্ত পুনরাবৃত্তকারী ধরণগুলি ডেরেফারিং সমর্থন করে)) copyফাংশনটির জন্য একটি পুনরুক্তি প্রয়োজন যা কমপক্ষে ইনক্রিমেন্টিং সমর্থন করে।

আপনি এখানে বিভিন্ন পুনরাবৃত্তি ধারণা সম্পর্কে পড়তে পারেন ।

সুতরাং, ইনক্রিমেন্টিং পয়েন্টারগুলি হ'ল সি-অ্যারেতে পুনরাবৃত্তি করার একটি আইডিয়োমেটিক সি ++ উপায়, বা সি-অ্যারেতে উপাদান / অফসেট অ্যাক্সেস করা।


3
যদিও আমি প্রথম উদাহরণটির মতো পয়েন্টার ব্যবহার করি, তবে আমি এটির পুনরুক্তিকারী হিসাবে কখনও ভাবি নি, এটি এখন অনেক অর্থবোধ করে।
রঞ্জকদৃষ্টি

1
"শূন্যতার মুখোমুখি হলে লুপটি স্বয়ংক্রিয়ভাবে শেষ হয়।" এটি একটি ভয়াবহ প্রতিমা।
চার্লস উড

9
@ চার্লসউড, তারপরে আমি অনুমান করি আপনাকে অবশ্যই সি ভীষণ ভয়ঙ্কর খুঁজে পাবেন
সেলার

7
@ চার্লসউড: বিকল্পটি স্ট্রিংয়ের দৈর্ঘ্যটিকে লুপ নিয়ন্ত্রণ ভেরিয়েবল হিসাবে ব্যবহার করা হয় যার অর্থ দু'বার স্ট্রিংকে ট্র্যাভার করা (একবার দৈর্ঘ্য নির্ধারণ করার জন্য এবং একবারে অক্ষরগুলি অনুলিপি করা)। আপনি যখন 1MHz PDP-7 এ চলেছেন তখন তা সত্যিই যুক্ত হওয়া শুরু করতে পারে।
টিএমএন

3
@ আইএনডেক: সবার আগে, সি এবং সি ++ ভাঙ্গা পরিবর্তনগুলি প্রবর্তন করার জন্য যে কোনও মূল্যে এড়াতে চেষ্টা করুন - এবং আমি বলব যে স্ট্রিং লিটারালগুলির ডিফল্ট আচরণকে পরিবর্তন করা যথেষ্ট পরিবর্তন হবে। তবে সর্বাধিক গুরুত্বপূর্ণ, শূন্য-সমাপ্ত স্ট্রিংগুলি কেবল একটি সম্মেলন (স্ট্রিং লিটারালগুলি ডিফল্টরূপে শূন্য-সমাপ্ত এবং লাইব্রেরির ফাংশনগুলি তাদের প্রত্যাশা করে এটি অনুসরণ করা সহজ), কেউ আপনাকে সিতে গণিত স্ট্রিংগুলি ব্যবহার করতে বাধা দেয় না - আসলে, বেশ কয়েকটি সি লাইব্রেরি সেগুলি ব্যবহার করে (উদাহরণস্বরূপ OLE এর বিএসটিআর)।
মাত্তেও ইটালিয়া

16

পয়েন্টার গাণিতিকটি সি ++ তে থাকে কারণ এটি সি তে ছিল পয়েন্টার গাণিতিকটি সিতে থাকে কারণ এটি এসেম্বলারের ক্ষেত্রে সাধারণ আইডিয়াম ।

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

এটি মূলত একই কারণে সি অ্যারেগুলি সীমানা-পরীক্ষা করা হয় না এবং সি স্ট্রিংগুলির মধ্যে একটি আকার এম্বেড থাকে না: ভাষা এমন একটি সিস্টেমে তৈরি করা হয়েছিল যেখানে প্রতিটি বাইট এবং প্রতিটি নির্দেশ গণনা করা হয়।

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