c++ - দুটি ভিন্ন বাফার সঙ্গে পয়েন্টার গাণিতিক




pointers language-lawyer (3)

তৃতীয় লাইন অনির্ধারিত আচরণ, তাই স্ট্যান্ডার্ড যে পরে কিছু অনুমতি দেয়।

এটি শুধুমাত্র একই অ্যারে (বা পরে) নির্দেশ করে দুটি পয়েন্টার বিয়োগ করা বৈধ।

উইন্ডোজ বা লিনাক্স সত্যিই প্রাসঙ্গিক নয়; কম্পাইলার এবং বিশেষ করে তাদের optimizers আপনার প্রোগ্রাম বিরতি হয়। উদাহরণস্বরূপ, একটি অপটিমাইজার চিনতে পারে যে p1 এবং p2 উভয়টি একটি int[100] শুরুতে পয়েন্ট করে তাই p1-p2 0 হতে হবে।

নিম্নলিখিত কোড বিবেচনা করুন:

int* p1 = new int[100];
int* p2 = new int[100];
const ptrdiff_t ptrDiff = p1 - p2;

int* p1_42 = &(p1[42]);
int* p2_42 = p1_42 + ptrDiff;

এখন, স্ট্যান্ডার্ড গ্যারান্টি যে p2_42 পয়েন্ট p2[42] ? যদি না হয় তবে উইন্ডোজ, লিনাক্স বা ওয়েবসেস্বুলিপিতে হিপ কি সবসময়ই সত্য?


মান উদ্ধৃতি যোগ করার জন্য:

expr.add#5

যখন দুটি পয়েন্টার এক্সপ্রেশন P এবং Q হ্রাস করা হয়, ফলাফলের ধরন একটি বাস্তবায়ন-সংজ্ঞায়িত স্বাক্ষরযুক্ত অবিচ্ছেদ্য প্রকার; এই std::ptrdiff_t একই ধরনের হবে যা std::ptrdiff_t হিসাবে <cstddef> শিরোনাম ([support.types]) হিসাবে সংজ্ঞায়িত করা হবে।

  • (5.1) যদি P এবং Q উভয় নিল পয়েন্টার মানগুলির মূল্যায়ন করে তবে ফলাফলটি 0।

  • (5.2) অন্যথায়, যদি P এবং Q পয়েন্ট যথাক্রমে একই অ্যারে বস্তুর x , x[i] এবং x[j] উপাদানের x , এক্সপ্রেস P - Q মানটি i−j

  • (5.3) অন্যথা, আচরণ অনির্দিষ্ট হয়। [ দ্রষ্টব্য: যদি মান i−j std::ptrdiff_t টাইপের প্রতিনিধিত্বযোগ্য মানগুলির std::ptrdiff_t তবে আচরণটি অনির্ধারিত। - শেষ নোট]

(5.1) পয়েন্টার nullptrs হয় না হিসাবে প্রযোজ্য নয়। (5.2) প্রযোজ্য নয় কারণ পয়েন্টারগুলি একই অ্যারে নয়। সুতরাং, আমরা (5.3) - UB সঙ্গে বাকি আছে।


const ptrdiff_t ptrDiff = p1 - p2;

এই অনির্ধারিত আচরণ। দুই পয়েন্টারের মধ্যে বিয়োগটি যদি শুধুমাত্র একই অ্যারের উপাদানগুলিকে নির্দেশ করে তবেই সেটি ঠিকভাবে সংজ্ঞায়িত করা হয়। ( [expr.add] ¶5.3 )।

যখন দুটি পয়েন্টার এক্সপ্রেশন P এবং Q হ্রাস করা হয়, ফলাফলের ধরন একটি বাস্তবায়ন-সংজ্ঞায়িত স্বাক্ষরযুক্ত অবিচ্ছেদ্য প্রকার; এই std::ptrdiff_t একই ধরনের হবে যা std::ptrdiff_t হিসাবে <cstddef> শিরোনাম ([support.types]) হিসাবে সংজ্ঞায়িত করা হবে।

  • যদি P এবং Q উভয় নিল পয়েন্টার মানগুলির মূল্যায়ন করে, ফলাফল 0 হয়।
  • অন্যথা, যদি পি এবং Q পয়েন্ট যথাক্রমে একই অ্যারে বস্তুর x , x[i] এবং x[j] উপাদানের x , এক্সপ্রেস P - Q মানটি i−j
  • অন্যথা, আচরণ অনির্ধারিত হয়

এমনকি যদি বৈধভাবে এই মানটি অর্জন করার জন্য কিছু কল্পনাপ্রসূত উপায়ও ছিল, এমনকি সেই সংক্ষেপটিও অবৈধ, এমনকি একটি পয়েন্টার + পূর্ণসংখ্যা সংক্ষেপটি অ্যারের সীমানাগুলির ভিতরে থাকার জন্য সীমিত ( [expr.add] ¶4.2 )

যখন কোন অভিব্যক্তি J অবিচ্ছেদ্য টাইপ থাকে অথবা পয়েন্টার টাইপের একটি অভিব্যক্তি P থেকে বিয়োগ করা হয়, ফলাফলটি P এর প্রকার থাকে।

  • যদি P একটি নিল পয়েন্টার মান মূল্যায়ন করে এবং J মূল্যায়ন করে তবে ফলাফলটি একটি নিল পয়েন্টার মান।
  • অন্যথায়, যদি P উপাদানগুলিকে x[i] উপাদানের সাথে x[i] উপাদানগুলির x[i] নির্দেশ করে, তখন x P + J উপাদানগুলি P + J এবং J + P (যেখানে J মান থাকে) x[i+j] (সম্ভবত-কল্পিত) উপাদান x[i+j] যদি 0≤i+j≤n এবং expression P - J পয়েন্টটিকে (সম্ভাব্য-কল্পিত) উপাদানটি x[i−j] 0≤i−j≤n
  • অন্যথা, আচরণ অনির্ধারিত হয়।






pointer-arithmetic