আমি আপনার প্রশ্নটিকে দুটি প্রশ্ন হিসাবে ব্যাখ্যা করব: 1) কেন ->
উপস্থিত রয়েছে এবং 2) কেন .
পয়েন্টারটি স্বয়ংক্রিয়ভাবে অবচয় হয় না। উভয় প্রশ্নের উত্তরের historicalতিহাসিক মূল রয়েছে।
->
এমনকি কেন বিদ্যমান?
সি ভাষার প্রথম সংস্করণগুলির মধ্যে একটিতে (যা আমি " সি রেফারেন্স ম্যানুয়াল " এর জন্য সিআরএম হিসাবে উল্লেখ করব , যা ১৯ 197৫ সালের মে মাসে 6th ষ্ঠ সংস্করণ ইউনিক্স নিয়ে এসেছিল), অপারেটরের ->
খুব অনন্য অর্থ ছিল, সমার্থক *
এবং .
সমন্বয় নয়
সিআরএম দ্বারা বর্ণিত সি ভাষাটি অনেক দিক থেকে আধুনিক সি থেকে খুব আলাদা ছিল। সিআরএম স্ট্রাক্টের সদস্যরা বাইট অফসেটের বৈশ্বিক ধারণাটি প্রয়োগ করেছেন , যা কোনও ঠিকানার কোনও সীমাবদ্ধতা ছাড়াই কোনও ঠিকানার মানতে যুক্ত হতে পারে। অর্থাৎ সমস্ত কাঠামোর সদস্যের সমস্ত নামের স্বতন্ত্র বৈশ্বিক অর্থ ছিল (এবং, অতএব, অনন্য হতে হবে)। উদাহরণস্বরূপ আপনি ঘোষণা করতে পারেন
struct S {
int a;
int b;
};
এবং নামটি a
অফসেট ০-এর জন্য দাঁড়ায়, আর নামটি b
অফসেট ২-এর জন্য দাঁড়ায় ( int
আকারের ধরণ 2 এবং কোনও প্যাডিং না ধরে) would অনুবাদ ইউনিটে সমস্ত স্ট্রাক্টের সমস্ত সদস্যের ভাষাটির প্রয়োজন হয় স্বতন্ত্র নাম অথবা একই অফসেট মানের জন্য দাঁড়ানো। যেমন একই অনুবাদ ইউনিটে আপনি অতিরিক্তভাবে ঘোষণা করতে পারেন
struct X {
int a;
int x;
};
এবং এটি ঠিক থাকবে, যেহেতু নামটি a
ধারাবাহিকভাবে অফসেট 0 এর জন্য দাঁড়াবে But তবে এই অতিরিক্ত ঘোষণা
struct Y {
int b;
int a;
};
এটি আনুষ্ঠানিকভাবে অবৈধ হবে, যেহেতু এটি a
অফসেট 2 এবং b
অফসেট 0 হিসাবে "পুনরায় সংজ্ঞায়িত" করার চেষ্টা করেছিল ।
আর এই কোথায় ->
অপারেটর আসে। যেহেতু প্রত্যেক struct হয় সদস্য নাম নিজস্ব স্বাবলম্বী বিশ্বব্যাপী অর্থ ছিল, ভাষা সমর্থিত এই মত এক্সপ্রেশন
int i = 5;
i->b = 42; /* Write 42 into `int` at address 7 */
100->a = 0; /* Write 0 into `int` at address 100 */
প্রথম অ্যাসাইনমেন্ট যেমন কম্পাইলার ব্যাখ্যা করা হয় "নিতে ঠিকানা 5
, অফসেট যোগ 2
এটি এবং দায়িত্ব অর্পণ করা 42
থেকে int
পরিসমাপ্তি ঠিকানায় মান"। অর্থাত উপরে দায়িত্ব অর্পণ করবে 42
করার int
ঠিকানায় মান 7
। মনে রাখবেন যে এর ব্যবহারটি ->
বাম-হাতের অভিব্যক্তির ধরণের বিষয়ে চিন্তা করে না। বাম হাতটি মূল্যের সংখ্যাসূচক ঠিকানা হিসাবে ব্যাখ্যা করা হয়েছে (এটি পয়েন্টার বা একটি পূর্ণসংখ্যা)।
এই ধরণের কৌশল *
এবং .
সংমিশ্রণ সম্ভব ছিল না । আপনি করতে পারেন না
(*i).b = 42;
যেহেতু *i
ইতিমধ্যে একটি অবৈধ অভিব্যক্তি। *
অপারেটর, যেহেতু এটি থেকে পৃথক .
তার প্রতীক উপর, চাপিয়ে আরো কঠোর টাইপ প্রয়োজনীয়তা। এই সীমাবদ্ধতাটি ঘিরে কাজ করার জন্য একটি দক্ষতা সরবরাহ করার জন্য সিআরএম ->
অপারেটরটির সাথে পরিচয় করিয়ে দিয়েছিল , যা বাম-হাতের ক্রিয়াকলাপ থেকে পৃথক।
কীথ মন্তব্যগুলিতে উল্লেখ করেছেন, ->
এবং *
+ .
সংমিশ্রণের মধ্যে এই পার্থক্যটি সিআরএম 7.১.৮-তে "প্রয়োজনীয়তার শিথিলকরণ" হিসাবে উল্লেখ করছে: পয়েন্টার ধরণের প্রয়োজনের শিথিলকরণ বাদে E1
অভিব্যক্তিটি E1−>MOS
ঠিক সমান(*E1).MOS
পরে, কেএন্ডআর সিতে মূলত সিআরএম-এ বর্ণিত অনেকগুলি বৈশিষ্ট্য উল্লেখযোগ্যভাবে পুনরায় কাজ করা হয়েছিল। "গ্লোবাল অফসেট শনাক্তকারী হিসাবে স্ট্রাক্ট সদস্যের ধারণা" সম্পূর্ণরূপে সরানো হয়েছে। এবং ->
অপারেটরের কার্যকারিতা *
এবং .
সংমিশ্রণের কার্যকারিতা সম্পূর্ণরূপে অভিন্ন হয়ে উঠেছে ।
.
পয়েন্টারটি স্বয়ংক্রিয়ভাবে কেন অবজ্ঞা করতে পারে না ?
আবার, ভাষার সিআরএম সংস্করণে .
অপারেটরের বাম অপারেন্ডের একটি লভ্যালু হওয়া দরকার । এই অপারেন্ডে কেবলমাত্র একমাত্র প্রয়োজনীয়তা আরোপ করা হয়েছিল (এবং ->
উপরে বর্ণিত হিসাবে এটিই এটিকে আলাদা করেছে )। লক্ষ্য করুন সিআরএম হয়নি না বাম প্রতীক প্রয়োজন .
একটি struct টাইপ আছে। এটি কেবল এটি একটি ল্যাভালু, কোনও লভালু হওয়া দরকার। এর অর্থ সি এর সিআরএম সংস্করণে আপনি এই জাতীয় কোড লিখতে পারেন
struct S { int a, b; };
struct T { float x, y, z; };
struct T c;
c.b = 55;
এক্ষেত্রে সংকলকটি অবিচ্ছিন্ন মেমরি ব্লকের বাইট-অফসেট 2 এ অবস্থিত 55
একটি int
মান হিসাবে লিখবে c
, যদিও টাইপের struct T
কোনও ক্ষেত্রের নাম নেই b
। সংকলকটি প্রকৃত ধরণের বিষয়ে মোটেই চিন্তা করে না c
। c
এগুলির যত্ন নেওয়া সমস্তটাই হ'ল একটি মূল্যবান: একধরনের লিখনযোগ্য মেমরি ব্লক।
এখন মনে রাখবেন যে আপনি যদি এটি করেন
S *s;
...
s.b = 42;
কোডটি বৈধ হিসাবে বিবেচিত হবে (যেহেতু s
এটি একটি লভ্যালুও) এবং সংকলকটি কেবল পয়েন্টারে s
নিজেই বাইট-অফসেটে ডেটা লেখার চেষ্টা করবে say বলা বাহুল্য, এই জাতীয় জিনিসগুলি সহজেই স্মৃতিকে ছাপিয়ে যেতে পারে তবে ভাষা এ জাতীয় বিষয় নিয়ে নিজেকে উদ্বিগ্ন করেনি।
অর্থাত্ ভাষাটির সেই সংস্করণে .
পয়েন্টার ধরণের জন্য ওভারলোডিং অপারেটর সম্পর্কে আপনার প্রস্তাবিত ধারণাটি কার্যকর হবে না: .
পয়েন্টারগুলির সাথে ব্যবহার করার সময় অপারেটরের ইতিমধ্যে খুব সুনির্দিষ্ট অর্থ ছিল (ল্যাভালু পয়েন্টার সহ বা কোনও লভ্যু দিয়ে)। এটি খুব অদ্ভুত কার্যকারিতা ছিল, সন্দেহ নেই। তবে সে সময় সেখানে ছিল।
অবশ্যই, এই অদ্ভুত কার্যকারিতাটি .
সি - কে ও আর সি এর পুনঃনির্মাণ সংস্করণে পয়েন্টারগুলির জন্য ওভারলোডেড অপারেটর (যেমন আপনি প্রস্তাব করেছিলেন) প্রবর্তনের বিরুদ্ধে খুব শক্ত কারণ নয় তবে এটি করা হয়নি। হয়তো সে সময় সি এর সিআরএম সংস্করণে কিছু লিগ্যাসি কোড লেখা ছিল যা সমর্থন করতে হয়েছিল।
(1975 সি রেফারেন্স ম্যানুয়ালটির URL টি স্থিতিশীল নাও হতে পারে Another সম্ভবত কিছু সূক্ষ্ম পার্থক্য সহ আরও একটি অনুলিপি এখানে রয়েছে ))