কোনও মেমরি ঠিকানা না হলে সি পয়েন্টার ঠিক কী?


206

সি সম্পর্কে একটি নামী সূত্রে &অপারেটর নিয়ে আলোচনা করার পরে নিম্নলিখিত তথ্য দেওয়া হয়েছে :

... এটি কিছুটা দুর্ভাগ্যজনক যে পরিভাষাটি [ঠিকানার] অবশেষ রয়েছে, কারণ এটি তাদের ঠিকানাগুলিকে বিভ্রান্ত করে যারা ঠিকানাগুলি কী তা জানেন এবং যাঁরা করেন তাদের বিভ্রান্ত করেন: পয়েন্টারগুলির বিষয়ে চিন্তা করা যেমন তারা ঠিক ঠিকানা হয় ... ।

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

এখন আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি - একটি পয়েন্টার ঠিক কী, তবে কোনও স্মৃতি ঠিকানা না হলে?

পুনশ্চ

লেখক পরে বলেছেন: ... যদিও আমি 'অ্যাড্রেস' শব্দটি ব্যবহার করতে থাকব, কারণ একটি ভিন্ন আবিষ্কার করা [শব্দ] আরও খারাপ হতে পারে।


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

7
উক্তিটির জন্য আপনার "নামী উত্স" কী?
কর্নস্টালক

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

9
@ লোকেরা পয়েন্টারটিকে = পূর্ণসংখ্যা বলে মনে করে কারণ এটি প্রায়শই হয় (x86 লিনাক্স এবং উইন্ডোজ আমাদের "শেখায়" যেহেতু, মানুষ সাধারণীকরণ পছন্দ করে, কারণ লোকেরা ভাষাটির মানকে ভালভাবে জানে না এবং কারণ তাদের মূলত ভিন্নতার সাথে সামান্য অভিজ্ঞতা ছিল) প্ল্যাটফর্মের। এই একই লোকেরা সম্ভবত ধরে নিতে পারে যে ডেটাতে একটি পয়েন্টার এবং একটি ফাংশনের পয়েন্টার একে অপরকে রূপান্তর করা যায় এবং ডেটা কোড হিসাবে কোড হিসাবে প্রয়োগ করা যেতে পারে এবং ডেটা হিসাবে কোড অ্যাক্সেস করা যায়। যদিও এটি ভন নিউম্যান আর্কিটেকচারে সত্য হতে পারে (1 ঠিকানার জায়গার সাথে), তবে হার্ভার্ড আর্কিটেকচারের ক্ষেত্রে অগত্যা সত্য নয় (ডাব্লু / কোড এবং ডেটা স্পেস)।
আলেক্সি ফ্রুঞ্জ

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

উত্তর:


148

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

একটি পয়েন্টার মান হ'ল এক ধরণের আইডি বা হ্যান্ডেল বা বিভিন্ন আইডির সংমিশ্রণ হতে পারে (x86 বিভাগ এবং অফসেটগুলিকে হ্যালো বলুন) এবং সত্যিকারের মেমরি ঠিকানা নয় not এই আইডি কিছু হতে পারে, এমনকি একটি নির্দিষ্ট আকারের পাঠ্য স্ট্রিং। ঠিকানাবিহীন প্রতিনিধিত্বগুলি বিশেষত কোনও সি দোভাষীর পক্ষে দরকারী।


34
ব্যাখ্যা করার মতো অনেক কিছুই নেই। প্রতিটি ভেরিয়েবলের মেমরিতে তার ঠিকানা থাকে। তবে আপনাকে তাদের ঠিকানাগুলিকে পয়েন্টারে সঞ্চয় করতে হবে না। পরিবর্তে আপনি 1 থেকে যা কিছু আপনার ভেরিয়েবলগুলি সংখ্যা করতে পারেন এবং পয়েন্টারে সেই সংখ্যাটি সংরক্ষণ করতে পারেন। ভাষা মান অনুসারে এটি পুরোপুরি আইনী, যতক্ষণ বাস্তবায়ন জানে যে কীভাবে এই সংখ্যাগুলিকে ঠিকানাগুলিতে রূপান্তর করতে হয় এবং কীভাবে সেই সংখ্যার সাথে পয়েন্টার গাণিতিক করতে হয় এবং মান দ্বারা প্রয়োজনীয় অন্যান্য সমস্ত জিনিস।
আলেক্সি ফ্রুঞ্জ

4
আমি যোগ করতে চাই x x এ, একটি মেমরি ঠিকানার মধ্যে একটি সেগমেন্ট সিলেক্টর এবং একটি অফসেট থাকে, সুতরাং পয়েন্টারটিকে সেগমেন্ট হিসাবে উপস্থাপন করা হয়: অফসেটটি এখনও মেমরি ঠিকানা ব্যবহার করে।
থ্যাং

6
@ লন্ডিন যখন আমি আমার প্ল্যাটফর্ম এবং আমার সংকলকটি জানি তখন মানকেন্দ্রিক জেনেরিক প্রকৃতি এবং অগ্রহণযোগ্য আমার উপেক্ষা করার কোনও সমস্যা নেই। আসল প্রশ্নটি জেনেরিক তবে এটির উত্তর দেওয়ার সময় আপনি মানটিকে উপেক্ষা করতে পারবেন না।
আলেক্সি ফ্রুঞ্জ

8
@ লন্ডিন আপনার বিপ্লবী বা বিজ্ঞানী হওয়ার দরকার নেই। মনে করুন আপনি একটি শারীরিক 16-বিট মেশিনে 32-বিট মেশিনটি অনুকরণ করতে চান এবং আপনি ডিস্ক স্টোরেজ ব্যবহার করে আপনার 64KB র্যাম 4 গিগাবাইট পর্যন্ত প্রসারিত করতে পারেন এবং 32-বিট পয়েন্টারগুলি অফসেট হিসাবে একটি বিশাল ফাইলে প্রয়োগ করেন। এই পয়েন্টারগুলি সত্যিকারের মেমরি ঠিকানা নয়।
আলেক্সি ফ্রুঞ্জ

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

62

আমি আপনার উত্স সম্পর্কে নিশ্চিত নই, তবে আপনি যে ভাষাটির বর্ণনা দিচ্ছেন তা সি স্ট্যান্ডার্ড থেকে এসেছে:

.5.৫.৩.২ ঠিকানা এবং ইন্ডিরিশন অপারেটরগুলি
[...]
৩. অ্যানারি এবং অপারেটর তার অপারেন্ডের ঠিকানা দেয়। [...]

সুতরাং ... হ্যাঁ, পয়েন্টারগুলি মেমোরি ঠিকানাগুলিকে নির্দেশ করে। কমপক্ষে সি স্ট্যান্ডার্ডটি এর অর্থ বোঝাতে পরামর্শ দেয়।

এটিকে আরও স্পষ্টভাবে বলতে গেলে, একটি পয়েন্টারটি কোনও ঠিকানার মান ধারণ করে একটি পরিবর্তনশীল । কোনও বস্তুর ঠিকানা (যা কোনও পয়েন্টারে সঞ্চিত থাকতে পারে) আনরি দিয়ে ফিরে আসে& অপারেটরের ।

আমি "42 ওয়ালবি ওয়ে, সিডনি" ঠিকানাটি একটি ভেরিয়েবলে সংরক্ষণ করতে পারি (এবং সেই পরিবর্তনশীলটি হ'ল একটি "পয়েন্টার" হতে পারে, তবে যেহেতু এটি কোনও মেমরি ঠিকানা নয়, এটি আমরা সঠিকভাবে "পয়েন্টার" বলব না)। আপনার কম্পিউটারে এর বালতি মেমরির ঠিকানা রয়েছে। পয়েন্টারগুলি কোনও ঠিকানার মান সঞ্চয় করে (অর্থাত্ একটি পয়েন্টার "42 ওয়ালবি ওয়ে, সিডনি", যা একটি ঠিকানা হিসাবে মান সংরক্ষণ করে)।

সম্পাদনা: আমি আলেক্সি ফ্রুঞ্জের মন্তব্যটি প্রসারিত করতে চাই।

একটি পয়েন্টার ঠিক কি? সি স্ট্যান্ডার্ডটি দেখুন:

6.2.5 প্রকারভেদ
[...]
20 [...]
একটি পয়েন্টার টাইপ একটি ফাংশন টাইপ বা একটি বস্তু টাইপ বলা থেকে আহরিত হতে পারে রেফারেন্সড টাইপ । একটি পয়েন্টার টাইপ এমন একটি সামগ্রীর বর্ণনা দেয় যার মান রেফারেন্সযুক্ত ধরণের একটি সত্তাকে রেফারেন্স সরবরাহ করে। রেফারেন্সড টাইপ টি থেকে প্রাপ্ত পয়েন্টার টাইপটিকে কখনও কখনও '' পয়েন্টার টু টি '' বলা হয়। রেফারেন্স করা টাইপ থেকে পয়েন্টার টাইপের নির্মাণকে '' পয়েন্টার টাইপ ডেরাইভেশন '' বলা হয়। একটি পয়েন্টার টাইপ একটি সম্পূর্ণ অবজেক্টের ধরণ।

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

.3.৩.২.৩ পয়েন্টার
[...]
৫. একটি পূর্ণসংখ্যা যে কোনও পয়েন্টার ধরণের রূপান্তরিত হতে পারে। পূর্বনির্ধারিত ব্যতীত ফলাফলটি বাস্তবায়ন-সংজ্ঞায়িত, সঠিকভাবে সংযুক্ত নাও হতে পারে, রেফারেন্সযুক্ত ধরণের কোনও সত্তাকে নির্দেশ নাও করতে পারে এবং ফাঁদে উপস্থাপনা হতে পারে।

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

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

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

এটাই শেষ হওয়ার চেয়ে বেশি দীর্ঘ হয়ে গেল আমি ভেবেছিলাম ...


3
সি ইন্টারপ্রেটারে, একটি পয়েন্টারটি কোনও ঠিকানাবিহীন আইডি / হ্যান্ডেল / ইত্যাদি ধারণ করতে পারে।
আলেক্সি ফ্রুঞ্জ

4
@ এক্সবুক স্ট্যান্ডার্ডটি কোনওভাবেই সংকলিত সি
আলেক্সি ফ্রুঞ্জ

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

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

5
@ লন্ডিন: বাস্তব বিশ্বে বিদ্যমান কম্পিউটার সিস্টেমে 100% এর উপরে ইন্টিজার অ্যাড্রেস হিসাবে পয়েন্টারগুলি প্রয়োগ করা হয়েছে যে দাবিটি মিথ্যা। শব্দ সম্বোধন এবং সেগমেন্ট-অফসেট ঠিকানার সাথে কম্পিউটারের অস্তিত্ব রয়েছে সংকলকগুলি এখনও নিকটবর্তী এবং দূরের পয়েন্টারের জন্য সমর্থন সহ বিদ্যমান। পিডিপি -11 কম্পিউটার বিদ্যমান রয়েছে, আরএসএক্স -11 এবং টাস্ক বিল্ডার এবং এর ওভারলেগুলির সাথে, যেখানে কোনও পয়েন্টারকে ডিস্ক থেকে কোনও ফাংশন লোড করার জন্য প্রয়োজনীয় তথ্য সনাক্ত করতে হবে। পয়েন্টারটিতে কোনও বস্তুর মেমরি ঠিকানা না থাকলে যদি বস্তুটি স্মৃতিতে না থাকে!
এরিক পোস্টপিসিল

39

পয়েন্টার বনাম পরিবর্তনশীল

এই ছবিতে,

পয়েন্টার_পি একটি পয়েন্টার যা 0x12345 এ অবস্থিত এবং 0x34567 এ একটি চলক ভ্যারিয়েবল_ভিতে নির্দেশ করছে।


16
এটি কেবল পয়েন্টারের বিপরীতে ঠিকানার ধারণাটিকেই সম্বোধন করে না, তবে এটি অবিচ্ছেদ্যভাবে পয়েন্টটি মিস করে যে কোনও ঠিকানা কেবল একটি পূর্ণসংখ্যা নয়।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

19
-1, এটি কেবল একটি পয়েন্টার কী তা ব্যাখ্যা করে। যে question-- ছিল না এবং তোমরা সব জটিলতার যে প্রশ্ন ঠেলাঠেলি করছি হয় সম্পর্কে।
অ্যালেক্সিস

34

ঠিকানা হিসাবে একটি পয়েন্টার ভাবা একটি আনুমানিক । সমস্ত অনুমানের মতো, এটি কখনও কখনও দরকারী হওয়ার পক্ষে যথেষ্ট ভাল, তবে এটির উপর নির্ভর করাও এর অর্থ সঠিক নয় means

একটি পয়েন্টার একটি ঠিকানার মতো যা এটি নির্দেশ করে যে কোনও বস্তুটি কোথায় খুঁজে পাবে। এই উপমাটির একটি তাত্ক্ষণিক সীমাবদ্ধতা হ'ল সমস্ত পয়েন্টারে আসলে একটি ঠিকানা থাকে না। NULLএকটি পয়েন্টার যা কোনও ঠিকানা নয়। পয়েন্টার ভেরিয়েবলের সামগ্রীটি আসলে তিন ধরণের একটি হতে পারে:

  • ঠিকানা একটি বস্তু, যা dereferenced করা যেতে পারে (যদি pএর ঠিকানা রয়েছে xতারপর অভিব্যক্তি *pএকই মান হিসাবে হয়েছেx );
  • একটি নাল পয়েন্টার , যার NULLএকটি উদাহরণ;
  • অবৈধ বিষয়বস্তু, যা কোনও অবজেক্টের দিকে নির্দেশ করে না (যদি pকোনও বৈধ মান না ধরে থাকে তবে *pপ্রোগ্রামটি ক্র্যাশ করে দেওয়া মোটামুটি সাধারণ সম্ভাবনার সাথে কিছু করতে পারে ("অপরিজ্ঞাত আচরণ"))।

তদ্ব্যতীত, এটি পয়েন্টার (বৈধ এবং অ-নাল হলে) রয়েছে তা বলা আরও সঠিক হবে একটি ঠিকানা: একটি পয়েন্টার ইঙ্গিত যেখানে একটি বস্তু খুঁজে পেতে, কিন্তু তথ্য বাঁধা নেই।

বিশেষত, একটি পয়েন্টারের একটি প্রকার থাকে। বেশিরভাগ প্ল্যাটফর্মে, রানটাইমের সময় পয়েন্টারের ধরণের কোনও প্রভাব থাকে না, তবে এটির প্রভাব রয়েছে যা সংকলন সময়ে প্রকারের বাইরে চলে যায়। যদি ( ) এর pপয়েন্টার হয় , তবে কোনও পূর্ণসংখ্যার দিকে নির্দেশ করে যা বাইট পরে রয়েছে (ধরে নেওয়া এখনও একটি বৈধ পয়েন্টার)। যদি ( ) এর মতো একই ঠিকানায় সেই পয়েন্টের পয়েন্টার হয় তবে ঠিক একই ঠিকানা নয় isintint *p;p + 1sizeof(int)pp + 1qcharpchar *q = p;q + 1p + 1 । আপনি যদি ঠিকানা হিসাবে পয়েন্টারটিকে মনে করেন তবে এটি খুব স্বজ্ঞাত নয় যে একই অবস্থানের জন্য বিভিন্ন পয়েন্টারের জন্য "পরবর্তী ঠিকানা" আলাদা।

কিছু পরিবেশে বিভিন্ন উপস্থাপনা (মেমরিতে বিভিন্ন বিট নিদর্শন) সহ একাধিক পয়েন্টার মান থাকতে পারে যা মেমরিতে একই অবস্থানকে নির্দেশ করে। এগুলি একই ঠিকানা সম্বলিত পৃথক পয়েন্টার বা একই অবস্থানের জন্য পৃথক ঠিকানা হিসাবে আপনি ভাবতে পারেন - রূপকটি এই ক্ষেত্রে পরিষ্কার নয়। ==অপারেটর সবসময় আপনি বলে কিনা দুই operands তাই এই পরিবেশে আপনি করতে পারেন, একই অবস্থানে প্রতি নির্দেশ করা হয় p == qযদিও pএবং qবিভিন্ন বিট নিদর্শন আছে।

এমনকি এমন পরিবেশ রয়েছে যেখানে পয়েন্টারগুলি ঠিকানার বাইরে অনুমতি বা অন্যান্য অনুমতি সম্পর্কিত তথ্যের বাইরেও অন্যান্য তথ্য বহন করে। এগুলির মুখোমুখি না হয়ে আপনি সহজেই একজন প্রোগ্রামার হিসাবে আপনার জীবনের মধ্য দিয়ে যেতে পারেন।

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

সব মিলিয়ে, আপনি যতক্ষণ মনে রাখবেন ততক্ষণ ঠিকানা হিসাবে পয়েন্টার চিন্তা করা খুব খারাপ নয়

  • এটি কেবল বৈধ, নাল-পয়েন্টার যা ঠিকানা;
  • একই অবস্থানের জন্য আপনার একাধিক ঠিকানা থাকতে পারে;
  • আপনি ঠিকানায় পাটিগণিত করতে পারবেন না, এবং তাদের কোনও আদেশ নেই;
  • পয়েন্টারে এছাড়াও টাইপ তথ্য বহন করে।

অন্য পথে ঘুরতে যাওয়া আরও অনেক ঝামেলার বিষয়। ঠিকানার মতো দেখতে সমস্ত কিছুই পয়েন্টার হতে পারে না । কোথাও কোথাও কোনও পয়েন্টারটিকে বিট প্যাটার্ন হিসাবে উপস্থাপন করা হয় যা পূর্ণসংখ্যা হিসাবে পড়া যায় এবং আপনি বলতে পারেন যে এই পূর্ণসংখ্যাটি একটি ঠিকানা। তবে অন্য পথে যাওয়া, প্রতিটি পূর্ণসংখ্যা পয়েন্টার নয়।

প্রথমে কিছু সুপরিচিত সীমাবদ্ধতা রয়েছে; উদাহরণস্বরূপ, একটি পূর্ণসংখ্যা যা আপনার প্রোগ্রামের ঠিকানার জায়গার বাইরে অবস্থান নির্ধারণ করে কোনও বৈধ পয়েন্টার হতে পারে না। একটি মিসিলাইনড ঠিকানা কোনও প্রকারের জন্য প্রান্তিককরণের জন্য বৈধ পয়েন্টার তৈরি করে না; উদাহরণস্বরূপ, এমন প্ল্যাটফর্মে যেখানে int4-বাইট প্রান্তিককরণ প্রয়োজন, 0x7654321 একটি বৈধ int*মান হতে পারে না ।

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

unsigned int x = 0;
unsigned short *p = (unsigned short*)&x;
p[0] = 1;
printf("%u = %u\n", x, *p);

আপনি আশা করতে পারেন যে মিলের রান-অফ মেশিনে কোথায় sizeof(int)==4এবং sizeof(short)==2এটি প্রিন্ট করে 1 = 1?(লিটল-এন্ডিয়ান) বা 65536 = 1?(বিগ-এন্ডিয়ান)। তবে জিসিসি ৪.৪ সহ আমার -৪-বিট লিনাক্স পিসিতে:

$ c99 -O2 -Wall a.c && ./a.out 
a.c: In function main’:
a.c:6: warning: dereferencing pointer p does break strict-aliasing rules
a.c:5: note: initialized from here
0 = 1?

এই সাধারণ উদাহরণে কী ভুল হচ্ছে তা আমাদের সতর্ক করার জন্য জিসিসি যথেষ্ট সদর্থক - আরও জটিল উদাহরণগুলিতে সংকলকটি খেয়াল করতে পারে না। যেহেতু pথেকে ভিন্ন ধরণের রয়েছে &x, কোন pপয়েন্টগুলি পরিবর্তন করতে পয়েন্টগুলি কীভাবে প্রভাবিত করতে পারে না &x(কিছু ভাল-সংজ্ঞায়িত ব্যতিক্রমের বাইরে)। অতএব সংকলকটি xকোনও নিবন্ধের মান রাখতে এবং *pপরিবর্তন হিসাবে এই নিবন্ধটিকে আপডেট না করার স্বাধীনতা ber প্রোগ্রামটি একই ঠিকানার জন্য দুটি পয়েন্টারকে অবলম্বন করে এবং দুটি পৃথক মান অর্জন করে!

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

সুতরাং পয়েন্টারগুলিকে ঠিকানা হিসাবে সম্বোধন করার বিষয়টি আপনার বোধগম্যতার প্রথম পদক্ষেপ হিসাবে মনে করুন, তবে খুব বেশি দূরে সেই স্বজ্ঞাতাকে অনুসরণ করবেন না।


5
+1 টি। অন্যান্য উত্তরগুলি মনে হচ্ছে যে পয়েন্টার টাইপ তথ্য সহ আসে। এটি ঠিকানা / আইডি / যাই হোক না কেন আলোচনার চেয়ে অনেক বেশি গুরুত্বপূর্ণ।
undur_gongor

টাইপ তথ্য সম্পর্কে দুর্দান্ত পয়েন্ট। আমি নিশ্চিত নই যে সংকলক উদাহরণগুলি সঠিক, যদিও এটি খুব অসম্ভব বলে মনে হয়, উদাহরণস্বরূপ, *p = 3যখন পি শুরু করা হয়নি তখন এটি সফল হওয়ার গ্যারান্টিযুক্ত।
লার্শ

@ লার্শ আপনি ঠিক বলেছেন, ধন্যবাদ, আমি কীভাবে এটি লিখলাম? আমি এটি একটি উদাহরণ দিয়ে প্রতিস্থাপন করেছি যা এমনকি আমার পিসিতে অবাক করা আচরণ প্রদর্শন করে।
গিলস

1
উম, নাল কি ((বাতিল *) 0) ..?
অনিকেত ইনজি

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

19

পয়েন্টার হ'ল একটি পরিবর্তনশীল যা হোল্ডস মেমরি ঠিকানা, ঠিকানাটি নিজেই নয়। যাইহোক, আপনি একটি পয়েন্টারকে অবজ্ঞা করতে পারেন - এবং মেমরির অবস্থানটিতে অ্যাক্সেস পেতে পারেন।

উদাহরণ স্বরূপ:

int q = 10; /*say q is at address 0x10203040*/
int *p = &q; /*means let p contain the address of q, which is 0x10203040*/
*p = 20; /*set whatever is at the address pointed by "p" as 20*/

এটাই. এটা খুব সহজ।

এখানে চিত্র বর্ণনা লিখুন

আমি যা বলছি তা প্রদর্শনের জন্য একটি প্রোগ্রাম এবং এর ফলাফল এখানে রয়েছে:

http://ideone.com/rcSUsb

কার্যক্রম:

#include <stdio.h>

int main(int argc, char *argv[])
{
  /* POINTER AS AN ADDRESS */
  int q = 10;
  int *p = &q;

  printf("address of q is %p\n", (void *)&q);
  printf("p contains %p\n", (void *)p);

  p = NULL;
  printf("NULL p now contains %p\n", (void *)p);
  return 0;
}

5
এটি আরও বিভ্রান্ত করতে পারে। অ্যালিস, আপনি একটি বিড়াল দেখতে পারেন? না আমি কেবল একটি বিড়ালের হাসি দেখতে পাচ্ছি। সুতরাং যে পয়েন্টার একটি ঠিকানা বা পয়েন্টার বলা একটি পরিবর্তনশীল যা একটি ঠিকানা রাখে বা বলা হয় যে পয়েন্টার একটি ধারণার নাম যা কোনও ঠিকানা সম্পর্কিত ধারণা বোঝায়, বইয়ের লেখকরা কতটা দূরে বিভ্রান্তিতে যেতে পারে?
ইজিবুক

পয়েন্টারগুলিতে পাকা লোকদের কাছে @Eebbook, এটি বেশ সহজ। কোনও ছবি কি সাহায্য করবে?
অনিকেত ইঙ্গে

5
একটি পয়েন্টার অগত্যা একটি ঠিকানা রাখা হয় না। সি ইন্টারপ্রেটারে এটি অন্যরকম কিছু আইডি / হ্যান্ডেল হতে পারে।
আলেক্সি ফ্রুঞ্জ

"লেবেল" বা পরিবর্তনশীল নামটি একটি সংকলক / এসেম্বেলার এবং এটি মেশিন পর্যায়ে উপস্থিত নেই তাই আমি মনে করি না এটি স্মৃতিতে উপস্থিত হওয়া উচিত।
বেন

1
@ অ্যানিকেট একটি পয়েন্টার ভেরিয়েবলের মধ্যে একটি পয়েন্টারের মান থাকতে পারে। আপনার fopenযদি একবারে একাধিকবার ব্যবহারের প্রয়োজন হয় তবে আপনাকে অবশ্যই পরিবর্তনশীল হিসাবে ফলাফল সংরক্ষণ করতে হবে (যা fopenসর্বদা বেশ কার্যকর)।
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'

16

এই বইগুলির লেখকরা ঠিক কী বোঝাতে পেরেছেন তা বলা মুশকিল। কোনও পয়েন্টারে কোনও ঠিকানা রয়েছে কিনা তা নির্ভর করে আপনি কোনও ঠিকানা কীভাবে নির্ধারণ করেন এবং কীভাবে আপনি কোনও পয়েন্টারকে সংজ্ঞা দেন।

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

তবে, আমরা দেখতে পাচ্ছি যে (2) সম্ভবত সত্য, (1) সম্ভবত সত্য হতে হবে না। এবং এই সত্যটি কী তৈরি করতে হবে যে @ কর্নস্টাল্কসের উত্তর অনুসারে অপারেটরের ঠিকানা বলা হয় ? এর অর্থ কি এই যে স্পেসিফিকেশনটির লেখকরা কোনও পয়েন্টারের জন্য কোনও ঠিকানা রাখার ইচ্ছা রাখে?

সুতরাং আমরা কি বলতে পারি, পয়েন্টারে একটি ঠিকানা রয়েছে, তবে কোনও ঠিকানাটি পূর্ণসংখ্যা হতে পারে না? হতে পারে.

আমি মনে করি এগুলি সবই জিব্বার প্যাডেন্টিক সিমেটিক টক। এটি ব্যবহারিকভাবে বলতে গেলে সম্পূর্ণ মূল্যহীন। আপনি কি এমন একটি সংকলক সম্পর্কে ভাবতে পারেন যা কোডটি এমনভাবে উত্পন্ন করে যে কোনও পয়েন্টারের মান ঠিকানা হয় না? তা হলে কী? আমি যা ভেবেছিলাম...

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

উদাহরণ স্বরূপ,

 int x;
 int* y = &x;
 char* z = &x;

y এবং z উভয়ই পয়েন্টার, তবে y + 1 এবং z + 1 আলাদা। যদি সেগুলি মেমরির ঠিকানা হয় তবে এই অভিব্যক্তিগুলি কি আপনাকে একই মান দেবে না?

এবং এখানে মিথ্যা পয়েন্টারগুলি সম্পর্কে চিন্তাভাবনাগুলি যেমন তারা ঠিকানা হওয়ায় সাধারণত দুঃখের দিকে পরিচালিত করে । বাগগুলি লিখিত হয়েছে কারণ লোকেরা পয়েন্টারগুলি সম্পর্কে মনে করে যেন তারা ঠিকানা ছিল এবং এটি সাধারণত শোকের দিকে পরিচালিত করে

55555 সম্ভবত কোনও পয়েন্টার নয়, যদিও এটি কোনও ঠিকানা হতে পারে, তবে (ইনট *) 55555 পয়েন্টার। 55555 + 1 = 55556, তবে (int *) 55555 + 1 হ'ল 55559 (+/- আকারের পার্থক্যের (int))।


1
পয়েন্টার গাণিতিক দেখানোর জন্য +1 ঠিকানার গাণিতিকের মতো নয়।
কুত্স্কেম

16-বিট 8086 এর ক্ষেত্রে, একটি মেমরি ঠিকানা একটি বিভাগের বেস + অফসেট, উভয় 16 বিট দ্বারা বর্ণিত হয়। সেগমেন্ট বেস + অফসেটের অনেকগুলি সংমিশ্রণ রয়েছে যা মেমরিতে একই ঠিকানা দেয়। এই farপয়েন্টারটি কেবল "একটি পূর্ণসংখ্যা" নয়।
ভোনব্র্যান্ড

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

@ ট্যাং, "পয়েন্টার == ঠিকানা" ধারণাটি ভুল । প্রত্যেকে এবং তাদের প্রিয় খালা এমনটি বলতে থাকে যে এটি ঠিক করে না।
ভনব্র্যান্ড

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

15

ভাল, একটি পয়েন্টার একটি মেমরি অবস্থান প্রতিনিধিত্বমূলক একটি বিমূর্ততা । দ্রষ্টব্য যে উদ্ধৃতিটি পয়েন্টারগুলি সম্পর্কে মনে করা যেমন তাদের মেমরির ঠিকানাগুলি ভুল তা বলে না, এটি কেবলমাত্র বলে যে এটি "সাধারণত শোকের দিকে পরিচালিত করে"। অন্য কথায়, এটি আপনাকে ভুল প্রত্যাশার দিকে নিয়ে যায়।

শোকের সবচেয়ে সম্ভবত উত্স অবশ্যই পয়েন্টার গাণিতিক যা আসলে সি এর অন্যতম শক্তি। যদি কোনও পয়েন্টার একটি ঠিকানা হয় তবে আপনি প্রত্যাশিত পাটিগণিতের ঠিকানা গণিত হিসাবে প্রত্যাশা করবেন; কিন্তু এটা না. উদাহরণস্বরূপ, একটি ঠিকানায় 10 যুক্ত করা আপনাকে এমন ঠিকানা প্রদান করা উচিত যা 10 ঠিকানা ইউনিট দ্বারা বড়; তবে একটি পয়েন্টারে 10 যোগ করা এটি যে ধরণের অবজেক্টের দিকে ইঙ্গিত করে তার আকারের 10 গুণ বৃদ্ধি করে (এবং আসল আকার এমনকি নয়, তবে একটি সারিবদ্ধ সীমানা পর্যন্ত গোল করে)। একটি সঙ্গে int *32 বিট পূর্ণসংখ্যার সঙ্গে একজন সাধারণ আর্কিটেকচারের উপর, 10 যোগ করার জন্য এটি 40 অ্যাড্রেসিং ইউনিট (বাইটস) দ্বারা এটি বাড়ায় হবে। অভিজ্ঞ সি প্রোগ্রামাররা এটি সম্পর্কে সচেতন এবং এর সাথে বেঁচে থাকে তবে আপনার লেখক স্পষ্টতই opালু রূপকের কোনও অনুরাগী নন।

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


12

অতীতে কিছু বিভ্রান্ত ব্যক্তির কাছে আমি এটি কীভাবে ব্যাখ্যা করেছি: এখানে একটি পয়েন্টারের দুটি বৈশিষ্ট্য রয়েছে যা এর আচরণকে প্রভাবিত করে। এর একটি মান রয়েছে (যা সাধারণ পরিবেশে) একটি মেমরি ঠিকানা এবং একটি প্রকার , যা আপনাকে নির্দেশ করে এমন অবজেক্টের ধরণ এবং আকার বলে দেয়।

উদাহরণস্বরূপ, প্রদত্ত:

union {
    int i;
    char c;
} u;

আপনার একই তিনটি আলাদা পয়েন্টার থাকতে পারে যা এই একই বস্তুর দিকে নির্দেশ করে:

void *v = &u;
int *i = &u.i;
char *c = &u.c;

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

v==i && i==c

তবে, আপনি যদি প্রতিটি পয়েন্টার বৃদ্ধি করেন তবে আপনি দেখতে পাবেন যে প্রকারটি তারা নির্দেশ করে প্রাসঙ্গিক হয়ে ওঠে।

i++;
c++;
// You can't perform arithmetic on a void pointer, so no v++
i != c

ভেরিয়েবল iএবং c, এই সময়ে বিভিন্ন মান কারণ হবে i++কারণ iপরবর্তী প্রবেশযোগ্য পূর্ণসংখ্যা এর ঠিকানা ধারণ করে, এবং c++কারণ cপরবর্তী Addressable অক্ষরে বিন্দু। সাধারণত, পূর্ণসংখ্যাগুলি অক্ষরগুলির চেয়ে বেশি মেমরি গ্রহণ করে, তাই উভয় বাড়ানোর পরে তার iচেয়ে বড় মান দিয়ে শেষ হবে c


2
+1 আপনাকে ধন্যবাদ। পয়েন্টারগুলির সাহায্যে মান এবং প্রকারটি যেমন অবিচ্ছেদ্য হয় তেমনি কোনও মানুষ তার শরীর থেকে পৃথক করতে পারে।
আকী সুহিকনেন

i == cদুর্গঠিত (আপনি কেবলমাত্র একের থেকে অন্যের মধ্যে অন্তর্নিহিত রূপান্তর থাকলে পয়েন্টারকে বিভিন্ন ধরণের সাথে তুলনা করতে পারেন)। আরও, এটি একটি কাস্টের সাথে সংশোধন করার অর্থ আপনি একটি রূপান্তর প্রয়োগ করেছেন এবং তারপরে রূপান্তরটি মান পরিবর্তন করে কিনা তা বিতর্কযোগ্য। (আপনি দৃ as়ভাবে বলতে পারেন যে এটি তা নয় তবে তারপরে এটি ঠিক একই বিষয়টিকেই দৃting়ভাবে বোঝাচ্ছে যা আপনি এই উদাহরণ দিয়ে প্রমাণ করার চেষ্টা করছেন)।
এমএম

8

মার্ক বেসি এটি ইতিমধ্যে বলেছিলেন, তবে এটি না বোঝা পর্যন্ত এটি পুনরায় জোর দেওয়া দরকার।

আক্ষরিক 3 এর চেয়ে ভেরিয়েবলের সাথে পয়েন্টারের অনেক কিছুই করার রয়েছে।

পয়েন্টার হ'ল একটি মান (কোনও ঠিকানার) এবং একটি ধরণের (অতিরিক্ত বৈশিষ্ট্য যেমন কেবল পঠনযোগ্য) সহ। প্রকারটি (এবং যদি অতিরিক্ত প্যারামিটারগুলি থাকে তবে) প্রসঙ্গটি আরও সংজ্ঞায়িত করতে বা সীমাবদ্ধ করতে পারে; যেমন। __far ptr, __near ptr: ঠিকানার প্রসঙ্গটি কী: স্ট্যাক, গাদা, লিনিয়ার ঠিকানা, কোথাও থেকে অফসেট, শারীরিক স্মৃতি বা কী।

এটি এমন ধরণের সম্পত্তি যা সংখ্যার গাণিতিকের তুলনায় পয়েন্টার পাটিগণিতকে কিছুটা আলাদা করে তোলে।

ভেরিয়েবল না হওয়ার পয়েন্টারের কাউন্টার উদাহরণগুলি উপেক্ষা করার মতো অনেক বেশি

  • fopen একটি ফাইল পয়েন্টার ফিরে। (পরিবর্তনশীল কোথায়)

  • স্ট্যাক পয়েন্টার বা ফ্রেম পয়েন্টার সাধারণত অপ্রয়োজনীয় রেজিস্টার হয়

    *(int *)0x1231330 = 13; - একটি বিন্দু_সামান্য টাইপের জন্য একটি ইন্টিজিটার পূর্ণসংখ্যার মান andালাই এবং কোনও ভেরিয়েবলের পরিচয় না দিয়ে কোনও পূর্ণসংখ্যার লেখা / পড়া

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


8

আপনি ঠিক এবং বুদ্ধিমান। সাধারণত, একটি পয়েন্টার কেবল একটি ঠিকানা, যাতে আপনি এটি পূর্ণসংখ্যার জন্য কাস্ট করতে এবং কোনও পাটিগণিত করতে পারেন।

তবে কখনও কখনও পয়েন্টারগুলি কোনও ঠিকানার অংশ থাকে। কিছু স্থাপত্যে একটি পয়েন্টার বেসের সংযোজন সাথে একটি ঠিকানায় রূপান্তরিত হয় বা অন্য কোনও সিপিইউ নিবন্ধ ব্যবহার করা হয়।

তবে আজকাল, পিসিতে এবং এআরএম আর্কিটেকচারে ফ্ল্যাট মেমরি মডেল এবং সি ভাষার সাথে স্থানীয়ভাবে সংকলিত, এটি মনে করা ঠিক হবে যে পয়েন্টারটি এক-মাত্রিক ঠিকানার উপযুক্ত কোনও স্থানে একটি পূর্ণসংখ্যার ঠিকানা address


পিসি ... ফ্ল্যাট মেমরি মডেল? নির্বাচকরা কী?
থ্যাং করুন

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

7

সি এর অন্যান্য পরিবর্তনশীলগুলির মতো একটি পয়েন্টার হ'ল মূলত বিটগুলির সংকলন যা এক বা একাধিক সংক্ষিপ্ত unsigned charমান দ্বারা উপস্থাপিত হতে পারে (অন্যান্য ধরণের ক্যারিয়েবল হিসাবে, sizeof(some_variable)সংখ্যাটি নির্দেশ করবে)unsigned char মানগুলির )। অন্যান্য ভেরিয়েবলের থেকে পয়েন্টারকে কী আলাদা করে তোলে তা হ'ল সি সংকলক একটি বিন্দুতে বিটগুলি সনাক্তকরণ হিসাবে চিহ্নিত করবে, কোনওভাবে এমন কোনও স্থান যেখানে ভেরিয়েবল সংরক্ষণ করা যেতে পারে। সিতে, অন্য কয়েকটি ভাষার মতো নয়, একাধিক ভেরিয়েবলের জন্য স্থানের অনুরোধ করা সম্ভব এবং তারপরে সেটের যে কোনও মানকে একটি পয়েন্টারকে পয়েন্টারে রূপান্তরিত করে সেটের মধ্যে অন্য কোনও ভেরিয়েবলে রূপান্তর করা সম্ভব।

অনেক সংকলক তাদের বিটগুলি প্রকৃত মেশিনের ঠিকানাগুলি ব্যবহার করে পয়েন্টারগুলি প্রয়োগ করে তবে এটি কেবল সম্ভাব্য বাস্তবায়ন নয়। একটি বাস্তবায়ন একটি অ্যারে রাখতে পারে - ব্যবহারকারীর কোডে অ্যাক্সেসযোগ্য নয় - হার্ডওয়্যার ঠিকানা তালিকাভুক্ত করে এবং একটি প্রোগ্রাম ব্যবহার করা সমস্ত মেমরি অবজেক্টের (ভেরিয়েবলের সেট) সমস্ত বরাদ্দ করা আকার এবং প্রতিটি পয়েন্টারটিতে অ্যারেতে একটি সূচক থাকে সেই সূচক থেকে অফসেট সহ এই জাতীয় নকশা কোনও সিস্টেমকে কেবলমাত্র তার মালিকানাধীন মেমরির উপরেই কেবল কোড পরিচালনার ক্ষেত্রে সীমাবদ্ধ রাখার অনুমতি দেয় না, এটি নিশ্চিত করে যে একটি মেমরি আইটেমের পয়েন্টারটি ঘটনাক্রমে অন্য মেমরি আইটেমটিতে পয়েন্টারে রূপান্তরিত করা যায় না (এমন সিস্টেমে যে হার্ডওয়্যার ব্যবহার করে ঠিকানাগুলি, যদি fooএবং এর পরিবর্তে প্রথম আইটেমটি নির্দেশ করেbar 10 আইটেমের অ্যারে হয় যা মেমোরিতে ক্রমাগত সংরক্ষণ করা হয়, এর "একাদশ" আইটেমের পয়েন্টারfoobar, তবে এমন একটি সিস্টেমে যেখানে প্রতিটি "পয়েন্টার" একটি অবজেক্ট আইডি এবং অফসেট থাকে, কোডটি যদি fooতার বরাদ্দকৃত সীমার বাইরে কোনও পয়েন্টারকে সূচকের চেষ্টা করে তবে সিস্টেমটি ফাঁদে ফেলতে পারে )। এ জাতীয় ব্যবস্থার জন্য মেমোরি-খণ্ডিত সমস্যাগুলি দূর করাও সম্ভব হবে, যেহেতু কোনও পয়েন্টারের সাথে যুক্ত শারীরিক ঠিকানাগুলি চারদিকে স্থানান্তরিত হতে পারে।

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


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

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

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

@ স্টিভ জেসাপ: একটি জিসি সিস্টেমটি কার্যকর হওয়ার জন্য, এটি হয় যা freeবলা হয় নি তা নির্ভরযোগ্যভাবে মেমরি ছেড়ে দিতে সক্ষম হওয়া উচিত , বা কোনও মুক্ত অবজেক্টের কোনও রেফারেন্সকে কোনও লাইভ অবজেক্টের রেফারেন্স হয়ে উঠতে বাধা দেয় [এমনকি প্রয়োজনীয় সংস্থানগুলি ব্যবহার করার সময়ও সুস্পষ্ট আজীবন পরিচালনা, জিসি এখনও কার্যকরভাবে পরবর্তীকালের কার্য সম্পাদন করতে পারে]; একটি জিসি সিস্টেম যা কখনও কখনও মিথ্যাভাবে অবজেক্টগুলিকে সরাসরি লাইভ রেফারেন্স হিসাবে বিবেচনা করে তা ব্যবহারযোগ্য হতে পারে যদি এন বড় হওয়ার সাথে সাথে অজানাভাবে পিন করা সম্ভাব্যতা একই সাথে শূন্যের কাছে পৌঁছায় । যদি না কেউ কোনও সংকলক ত্রুটি পতাকাঙ্কিত করতে ইচ্ছুক না হয় ...
সুপারক্যাট

... কোডের জন্য যা বৈধ সি ++, কিন্তু যার জন্য সংকলক প্রমাণ করতে অক্ষম হবে যে কোনও পয়েন্টার কখনই একটি অজ্ঞাত আকারে রূপান্তর করতে পারে না, আমি দেখতে পাচ্ছি না যে কোনও একটি ঝুঁকিকে কীভাবে এড়াতে পারে যা বাস্তবে কখনও হয় নি ইন্টিজার হিসাবে পয়েন্টার ব্যবহার করা ভুলভাবে এটি করা হিসাবে বিবেচিত হবে।
ক্যাট

6

পয়েন্টার হ'ল একটি পরিবর্তনশীল প্রকার যা সি / সি ++ এ স্থানীয়ভাবে পাওয়া যায় এবং এতে একটি মেমরি ঠিকানা থাকে। অন্যান্য ভেরিয়েবলের মতো এটির নিজস্ব একটি ঠিকানা রয়েছে এবং এটি মেমরি গ্রহণ করে (পরিমাণটি প্ল্যাটফর্ম নির্দিষ্ট)।

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


1
সাধারণত এটি হ্যান্ডেল / আইডি। সাধারণত, এটি একটি সরল ঠিকানা।
আলেক্সি ফ্রুঞ্জ

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

6

ব্রিফ সারসংক্ষেপ (যা আমি উপরেও রাখব):

(0) ঠিকানা হিসাবে পয়েন্টার ভাবনা প্রায়শই একটি ভাল শেখার সরঞ্জাম এবং সাধারণ তথ্য ধরণের পয়েন্টারগুলির জন্য প্রায়শই আসল বাস্তবায়ন।

(1) তবে অনেকের পক্ষে, সম্ভবত বেশিরভাগ ক্ষেত্রে, ফাংশনগুলিতে সংকলকগুলির নির্দেশকগুলি ঠিকানা নয়, তবে কোনও ঠিকানার চেয়ে বড় (সাধারণত 2x, কখনও কখনও আরও বেশি) হয়, বা আসলে ফাংশন এবং স্টাফের ঠিকানাগুলি মেমরির কোনও কাঠামোর দিকে নির্দেশক হয় like একটি ধ্রুবক পুল।

(২) ডেটা সদস্যদের নির্দেশক এবং পদ্ধতিগুলির দিকে নির্দেশকগুলি প্রায়শই অপরিচিতও হয়ে থাকে।

(3) FAR এবং নিকটবর্তী পয়েন্টার ইস্যুগুলির সাথে লিগ্যাসি x86 কোড

(4) বেশ কয়েকটি উদাহরণ, বিশেষত IBM AS / 400, সুরক্ষিত "ফ্যাট পয়েন্টার" সহ।

আমি নিশ্চিত আপনি আরও খুঁজে পেতে পারেন।

বিস্তারিত:

UMMPPHHH !!!!! এখনও অবধি অনেক উত্তর মোটামুটি সাধারণ "প্রোগ্রামার ওয়েইনি" এর উত্তর - তবে সংকলক ওয়েইনি বা হার্ডওয়্যার ওয়েইনি নয় we যেহেতু আমি একটি হার্ডওয়্যার ওয়েইনি হওয়ার ভান করি এবং প্রায়শই কম্পাইলার ওয়েইনিসের সাথে কাজ করি, আমাকে আমার দুটি সেন্টে ফেলে দিন:

অনেকগুলিতে, সম্ভবত বেশিরভাগ, সি সংকলক, টাইপের ডেটার একটি পয়েন্টার Tপ্রকৃতপক্ষে, এর ঠিকানা T

ফাইন।

তবে, এমনকি এর অনেকগুলি সংকলককেও, নির্দিষ্ট পয়েন্টারগুলি ঠিকানা নয়। আপনি এটি দেখে বলতে পারেন sizeof(ThePointer)

উদাহরণস্বরূপ, ফাংশনগুলিতে পয়েন্টারগুলি কখনও কখনও সাধারণ ঠিকানাগুলির চেয়ে বেশ বড় হয়। বা, এগুলি একটি স্তর নির্দেশনা জড়িত থাকতে পারে। এই নিবন্ধটিইন্টেল ইটানিয়াম প্রসেসরের সাথে জড়িত একটি বিবরণ সরবরাহ করে তবে আমি অন্যকে দেখেছি। সাধারণত, একটি ফাংশন কল করতে আপনাকে অবশ্যই ফাংশন কোডের ঠিকানাটিই জানতে হবে না, তবে ফাংশনটির ধ্রুবক পুলের ঠিকানাও জানতে হবে - মেমরির এমন একটি অঞ্চল যা থেকে কনস্টাইলগুলি জেনারেশনের পরিবর্তে একক লোড নির্দেশ সহ লোড করা হয় are বেশ কয়েকটি লোড তাত্ক্ষণিক এবং শিফট এবং OR নির্দেশাবলীর বাইরে একটি 64 বিট ধ্রুবক। সুতরাং, একক bit৪ বিটের ঠিকানার চেয়ে আপনার প্রয়োজন ২ 64৪ বিট ঠিকানা। কিছু এবিআই (অ্যাপ্লিকেশন বাইনারি ইন্টারফেস) এটিকে প্রায় 128 বিট হিসাবে স্থানান্তরিত করে, অন্যরা ফাংশন পয়েন্টারটি আসলে একটি ফাংশন বর্ণনাকারীর ঠিকানা যা কেবলমাত্র উল্লিখিত 2 টি আসল ঠিকানা রয়েছে। কোনটা ভাল? আপনার দৃষ্টিকোণের উপর নির্ভর করে: কার্য সম্পাদন, কোড আকার, এবং কিছু সামঞ্জস্যের সমস্যা - প্রায়শই কোড ধরে নেওয়া হয় যে একটি পয়েন্টার দীর্ঘ বা দীর্ঘ দীর্ঘতে কাস্ট করা যেতে পারে তবে এটি ধরেও নিতে পারে যে দীর্ঘ দীর্ঘটি হ'ল 64 বিট। এই জাতীয় কোড মান মেনে চলতে না পারে তবে তবুও গ্রাহকরা এটি কাজ করতে চায়।

আমাদের অনেকের কাছে পুরাতন ইন্টেল x86 সেগমেন্টযুক্ত আর্কিটেকচারের বেদনাদায়ক স্মৃতি রয়েছে, নিকটস্থ পয়েন্টার এবং ফার পয়েন্টার সহ। ধন্যবাদ, এগুলি এখন প্রায় বিলুপ্ত হয়ে গেছে, তাই কেবলমাত্র একটি দ্রুত সংক্ষিপ্তসার: 16 বিট আসল মোডে, আসল লিনিয়ার ঠিকানাটি ছিল

LinearAddress = SegmentRegister[SegNum].base << 4 + Offset

সুরক্ষিত মোডে, এটি হতে পারে

LinearAddress = SegmentRegister[SegNum].base + offset

ফলাফলটিতে বিভাগটিতে একটি সীমা নির্ধারণের বিপরীতে পরীক্ষা করা হচ্ছে। কিছু প্রোগ্রাম সত্যই স্ট্যান্ডার্ড সি / সি ++ ফার এবং নিকটবর্তী পয়েন্টার ঘোষণা হিসাবে ব্যবহৃত হয় না, তবে অনেকেই বলেছিলেন *T--- তবে সংকলক এবং লিঙ্কার সুইচগুলি ছিল তাই উদাহরণস্বরূপ, কোড পয়েন্টারগুলি পয়েন্টারগুলির নিকটে হতে পারে, যা আছে তার বিপরীতে মাত্র 32 বিট অফসেট সিএস (কোড সেগমেন্ট) নিবন্ধন করুন, যখন ডেটা পয়েন্টারগুলি এফআর পয়েন্টার হতে পারে, একটি 48 বিট মানের জন্য একটি 16 বিট সেগমেন্ট নম্বর এবং 32 বিট অফসেট উভয়ই নির্দিষ্ট করে। এখন, এই দুটি পরিমাণই অবশ্যই ঠিকানার সাথে সম্পর্কিত, তবে যেহেতু সেগুলি একই আকার নয়, তাদের মধ্যে ঠিকানাটি কোনটি? তদুপরি, বিভাগগুলি প্রকৃত ঠিকানার সাথে সম্পর্কিত স্টাফ ছাড়াও - কেবল পঠনযোগ্য, পঠন-লিখন, সম্পাদনযোগ্য।

আরও আকর্ষণীয় উদাহরণ, আইএমএইচও, হ'ল (বা, সম্ভবত) ছিলেন আইবিএম এএস / 400 পরিবার। এই কম্পিউটারটি সি ++ এ প্রথম কোনও ওএস প্রয়োগ করে। এই মেশিমের পয়েন্টারগুলি সাধারণত আসল ঠিকানার আকার 2X ছিল - যেমন এই উপস্থাপনাবলেছেন, 128 বিট পয়েন্টার, তবে আসল ঠিকানাগুলি 48-64 বিট ছিল এবং আবার কিছু অতিরিক্ত তথ্য, যাকে একটি সক্ষমতা বলা হয়, যা পড়ার, লেখার পাশাপাশি অনুমতি দেয় বাফার ওভারফ্লো প্রতিরোধের সীমাও। হ্যাঁ: আপনি সি / সি ++ এর সাথে এটি তুলনামূলকভাবে করতে পারেন - এবং যদি এটি সর্বব্যাপী হয় তবে চীনা পিএলএ এবং স্লাভিক মাফিয়া এতগুলি পশ্চিমা কম্পিউটার সিস্টেমে হ্যাকিং করত না। তবে historতিহাসিকভাবে বেশিরভাগ সি / সি ++ প্রোগ্রামিং পারফরম্যান্সের জন্য সুরক্ষা উপেক্ষা করেছে। সবচেয়ে মজার বিষয় হল, AS400 পরিবার অপারেটিং সিস্টেমটিকে সুরক্ষিত পয়েন্টার তৈরি করার অনুমতি দিয়েছে, এটি অনিবদ্ধ কোডে দেওয়া যেতে পারে, তবে যা অনিচ্ছাকৃত কোড জালিয়াতি বা ছলচাতুরি করতে পারে না। আবার সুরক্ষা এবং মান মেনে চলার সময় অনেকটা slালু নন-মানক সি / সি ++ কোড এই জাতীয় সুরক্ষিত সিস্টেমে কাজ করবে না। আবার, সরকারী মান আছে,

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

এটি সমাধানের বিভিন্ন উপায় রয়েছে [একক বনাম একাধিক ইনহিটেন্স এবং ভার্চুয়াল উত্তরাধিকার সম্পর্কিত সমস্যা]। এখানে ভিজ্যুয়াল স্টুডিও সংকলক এটি পরিচালনা করার সিদ্ধান্ত নেয় কীভাবে: একটি বহুগুণ-উত্তরাধিকারী শ্রেণীর সদস্য ফাংশনের একটি পয়েন্টার আসলে একটি কাঠামো "

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

আমি যেতে পারে, তবে আমি আশা করি আপনি ধারণা পাবেন।

ব্রিফ সারসংক্ষেপ (যা আমি উপরেও রাখব):

(0) ঠিকানা হিসাবে পয়েন্টারগুলির চিন্তাভাবনা প্রায়শই একটি ভাল শেখার সরঞ্জাম, এবং প্রায়শই সাধারণ ডেটা ধরণের পয়েন্টারগুলির জন্য প্রকৃত বাস্তবায়ন।

(1) তবে অনেকের পক্ষে, সম্ভবত বেশিরভাগ ক্ষেত্রে, ফাংশনগুলিতে সংকলকগুলির নির্দেশকগুলি ঠিকানা নয়, তবে কোনও ঠিকানার চেয়ে বড় (সাধারণত 2 এক্স, কখনও কখনও আরও বেশি) হয়, বা আসলে ফাংশন এবং স্টাফের ঠিকানাগুলি মেমরির কোনও কাঠামোর দিকে নির্দেশক হয় like একটি ধ্রুবক পুল।

(২) ডেটা সদস্যদের নির্দেশক এবং পদ্ধতিগুলির দিকে নির্দেশকগুলি প্রায়শই অপরিচিতও হয়ে থাকে।

(3) FAR এবং নিকটবর্তী পয়েন্টার ইস্যুগুলির সাথে লিগ্যাসি x86 কোড

(4) বেশ কয়েকটি উদাহরণ, বিশেষত IBM AS / 400, সুরক্ষিত "ফ্যাট পয়েন্টার" সহ।

আমি নিশ্চিত আপনি আরও খুঁজে পেতে পারেন।


16 বিট আসল মোডে LinearAddress = SegmentRegister.Selector * 16 + Offset(নোট বার 16, 16 দ্বারা শিফট নয়)। সুরক্ষিত মোডে LinearAddress = SegmentRegister.base + offset(কোনও প্রকারের গুণ নয়; সেগমেন্ট বেসটি জিডিটি / এলডিটিতে সংরক্ষণ করা হয় এবং সেগমেন্ট রেজিস্টারে যেমন ক্যাশে থাকে )।
আলেক্সি ফ্রুঞ্জ

আপনি বিভাগের বেস সম্পর্কেও সঠিক। আমি ভুল করেছিলাম। এটি সেগমেন্ট সীমা যা allyচ্ছিকভাবে 4K দ্বারা একাধিক। যখন সেগমেন্টের রেজিস্টারে মেমরি থেকে কোনও সেগমেন্ট বর্ণনাকারী লোড করা হয় তখন সেগমেন্ট বেসটি কেবল হার্ডওয়্যার দ্বারা আনস্র্যাম্বল করা দরকার।
ক্রেজি গ্লিউ

4

একটি পয়েন্টার হ'ল আরেকটি পরিবর্তনশীল যা মেমোরি অবস্থানের ঠিকানা ধরে রাখতে ব্যবহৃত হয় (সাধারণত অন্য ভেরিয়েবলের মেমরি ঠিকানা)।


সুতরাং, পয়েন্টটি আসলে একটি মেমরি ঠিকানা? আপনি কি লেখকের সাথে একমত নন? শুধু বুঝতে চেষ্টা করছি।
d0rmLife

পয়েন্টারের প্রাথমিক কাজটি হ'ল কোনও কিছুকে নির্দেশ করা। কীভাবে এটি অর্জন করা হয়েছে এবং আসল ঠিকানা রয়েছে কিনা তা নির্ধারিত নয়। পয়েন্টারটি কেবল একটি আইডি / হ্যান্ডেল হতে পারে, আসল ঠিকানা নয়।
আলেক্সি ফ্রুঞ্জ

4

আপনি এটি এইভাবে দেখতে পারেন। পয়েন্টার হ'ল এমন মান যা ঠিকানার যোগ্য মেমরি স্পেসে কোনও ঠিকানা উপস্থাপন করে।


2
একটি পয়েন্টার অগত্যা এটির মধ্যে সত্যিকারের মেমরি ঠিকানা রাখা উচিত নয়। আমার উত্তর এবং এর অধীনে মন্তব্য (গুলি) দেখুন।
আলেক্সি ফ্রুঞ্জ

কি .... স্ট্যাকের প্রথম ভেরিয়েবলের পয়েন্টার 0 টি প্রিন্ট করে না এটি কীভাবে এটি প্রয়োগ করা হয় তার উপর নির্ভর করে স্ট্যাক ফ্রেমের শীর্ষ (বা নীচে) মুদ্রণ করে।
থ্যাং

@ থ্যাং প্রথম পরিবর্তনশীলটির জন্য উপরের এবং নীচের অংশটি একই। এবং স্ট্যাকের ক্ষেত্রে শীর্ষ বা নীচের ঠিকানাটি কী?
ভ্যালেন্টিন রাদু

@ ভ্যালেন্টিনরাডু, আপনি কেন এটি চেষ্টা করবেন না .. অবশ্যই আপনি চেষ্টা করেননি।
থ্যাং

2
@ থ্যাং আপনি ঠিক বলেছেন, আমি কিছু সত্যই খারাপ অনুমান করেছি, আমার প্রতিরক্ষার জন্য এখানে সকাল AM টা।
ভ্যালেন্টিন রাদু

3

একটি পয়েন্টার হ'ল অন্য একটি চলক যা সাধারণত অন্য ভেরিয়েবলের মেমরি ঠিকানা রাখতে পারে। পয়েন্টারটি ভেরিয়েবল হওয়ায় এটির একটি মেমরি ঠিকানা থাকে।


1
অগত্যা কোনও ঠিকানা নয়। বিটিডব্লিউ, আপনার উত্তর পোস্ট করার আগে আপনি কি বিদ্যমান উত্তর এবং মন্তব্যগুলি পড়েছেন?
আলেক্সি ফ্রুঞ্জ

3

এসি পয়েন্টারটি মেমরির ঠিকানার মতো তবে মেশিন-নির্ভর বিবরণ বিমূর্ত করা, পাশাপাশি কয়েকটি স্তর নিম্ন স্তরের নির্দেশিকায় নেই।

উদাহরণস্বরূপ, একটি সি পয়েন্টার তুলনামূলকভাবে সমৃদ্ধভাবে টাইপ করা হয়। যদি আপনি স্ট্রাকচারের অ্যারের মাধ্যমে কোনও পয়েন্টার বৃদ্ধি করেন তবে এটি সুন্দরভাবে একটি কাঠামো থেকে অন্য কাঠামোতে লাফিয়ে যায়।

পয়েন্টার রূপান্তর নিয়মের সাপেক্ষে এবং সংকলন টাইম ধরণের চেক সরবরাহ করে।

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

একটি পয়েন্টারটি বুলিয়ান ভেরিয়েবল হিসাবে ব্যবহার করা যেতে পারে: এটি নাল ব্যতীত অন্যটি হলে সত্য এবং এটি শূন্য হলে মিথ্যা পরীক্ষা করে।

মেশিনের ভাষায়, যদি নাল পয়েন্টারটি 0xFFFFFFFF এর মতো একটি মজার ঠিকানা হয়, তবে আপনাকে সেই মানটির জন্য সুস্পষ্ট পরীক্ষা থাকতে হবে। সি আপনার কাছ থেকে এটি লুকায়। নাল পয়েন্টারটি 0xFFFFFFFFF হলেও, আপনি এটি ব্যবহার করে পরীক্ষা করতে পারেনif (ptr != 0) { /* not null! */}

পয়েন্টারগুলির ব্যবহারগুলি যা টাইপ সিস্টেমকে অপরিবর্তিত আচরণের দিকে পরিচালিত করে, যদিও মেশিনের ভাষায় অনুরূপ কোডটি অবশ্যই সংজ্ঞায়িত হতে পারে। এসেমব্লাররা আপনার লেখা নির্দেশাবলী একত্রিত করবেন, তবে সি সংকলকরা এই ভুল অনুমানের ভিত্তিতে অনুকূলিত করবেন যে আপনি কোনও ভুল করেন নি। যদি কোনও float *pপয়েন্টারটি একটি long nভেরিয়েবলের দিকে নির্দেশ করে এবং *p = 0.0কার্যকর করা হয় তবে এইটি পরিচালনা করার জন্য সংকলকটির প্রয়োজন হয় না। এর পরবর্তী ব্যবহারগুলি nভাসমান মানের বিট প্যাটার্নটি পড়ার প্রয়োজন পড়বে না, তবে সম্ভবত এটি একটি অনুকূলিত অ্যাক্সেস হবে যা "কঠোর আলিয়াজিং" অনুমানের ভিত্তিতে তৈরি nহয়েছে যা স্পর্শ করা হয়নি! এটি হ'ল এই ধারণাটি যে প্রোগ্রামটি ভাল আচরণ করেছে এবং তাই সেদিকেও pনির্দেশ করা উচিত নয় n

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

সুতরাং আপনি দেখতে পাচ্ছেন, মেশিনের ঠিকানা এবং সি পয়েন্টারগুলির মধ্যে অনেকগুলি অর্থগত পার্থক্য রয়েছে।


NULL পয়েন্টারগুলি সমস্ত প্ল্যাটফর্মগুলিতে যেভাবে আপনার মনে হয় সেভাবে কাজ করে না - দয়া করে উপরের সিসকোআইপিফোনে আমার উত্তর দেখুন। NULL == 0 এমন একটি অনুমান যা কেবল x86 ভিত্তিক প্ল্যাটফর্মগুলিতে ধারণ করে। কনভেনশন বলে যে নতুন প্ল্যাটফর্মগুলি x86 এর সাথে মেলে, তবে বিশেষত এমবেডেড বিশ্বে এটি এমন নয়। সম্পাদনা করুন: এছাড়াও, সি হার্ডওয়্যার থেকে পয়েন্টার উপায়ের মান বিমূর্ত করতে কিছুই করে না - "পিটিআর! = 0" এমন প্ল্যাটফর্মের নূলে পরীক্ষা হিসাবে কাজ করবে না যেখানে NULL! = 0
DX-MON

1
ডিএক্স-মোন, এটি স্ট্যান্ডার্ড সি এর জন্য সম্পূর্ণ ভুল N নুল 0 হবে, এবং সেগুলি বিবৃতিতে পরিবর্তিতভাবে ব্যবহার করা যেতে পারে। হার্ডওয়্যারে NULL পয়েন্টার উপস্থাপনা না হওয়াতে সমস্ত 0 বিট কীভাবে উত্স কোডে উপস্থাপন করা যায় তা সম্পর্কিত নয় ir
মার্ক বেসেসি

@ ডিএক্স-মন আমি আশঙ্কা করছি আপনি সঠিক তথ্য নিয়ে কাজ করছেন না। সিতে, অবিচ্ছেদ্য ধ্রুবক এক্সপ্রেশনটি নাল পয়েন্টার ধ্রুবক হিসাবে কাজ করে, নাল পয়েন্টারটি নাল ঠিকানা কিনা তা নির্বিশেষে। আপনি যদি কোনও সি সংকলক সম্পর্কে জানেন যেখানে ptr != 0নাল পরীক্ষা না হয় তবে দয়া করে এর পরিচয়টি প্রকাশ করুন (তবে আপনি এটি করার আগে, বিক্রেতাকে একটি বাগ রিপোর্ট প্রেরণ করুন)।
কাজ

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

1
@ আলেক্সিস অধ্যায় এবং শ্লোক, দয়া করে। সি শূন্য হতে নাল পয়েন্টারটি সংজ্ঞায়িত করে না। সি একটি নাল পয়েন্টার ধ্রুবকটি বোঝানোর জন্য একটি শিরোনাম হিসাবে শূন্য (বা কোনও অবিচ্ছেদ্য ধ্রুবক অভিব্যক্তি) সংজ্ঞায়িত করে । faqs.org/faqs/C-faq/faq (ধারা 5)।
কাজ

3

পয়েন্টারগুলি বোঝার আগে আমাদের অবজেক্টগুলি বুঝতে হবে। অবজেক্টস এমন সত্তা যা বিদ্যমান এবং একটি ঠিকানা হিসাবে একটি অবস্থান নির্দিষ্টকারী রয়েছে। পয়েন্টারটি হ'ল অন্য Cপ্রকারের মতো কেবল একটি ভেরিয়েবল যা pointerএর কন্টেন্টটিকে এমন কোনও সামগ্রীর ঠিকানা হিসাবে ব্যাখ্যা করা হয় যা নিম্নলিখিত অপারেশনটিকে সমর্থন করে।

+ : A variable of type integer (usually called offset) can be added to yield a new pointer
- : A variable of type integer (usually called offset) can be subtracted to yield a new pointer
  : A variable of type pointer can be subtracted to yield an integer (usually called offset)
* : De-referencing. Retrieve the value of the variable (called address) and map to the object the address refers to.
++: It's just `+= 1`
--: It's just `-= 1`

পয়েন্টারটি বর্তমানে এটির উল্লেখ করা অবজেক্টের ধরণের ভিত্তিতে শ্রেণিবদ্ধ করা হয়। এটি গুরুত্বপূর্ণ তথ্যের একমাত্র অংশটি অবজেক্টের আকার।

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

দ্রষ্টব্য এই ব্যাখ্যার পুরোপুরি, আমি স্মৃতির ধারণাটি রেখে গেছি।


আমি একটি সাধারণ সিস্টেমের সাধারণ পয়েন্টারের বিমূর্ত বাস্তব সম্পর্কে আপনার ব্যাখ্যাটি পছন্দ করি। তবে, সম্ভবত মেমরি নিয়ে আলোচনা করা সহায়ক হবে। আসলে, নিজের পক্ষে বলতে গেলে, আমি জানি ... আমি মনে করি বড় ছবিটি বোঝার জন্য সংযোগটি আলোচনা করা খুব সহায়ক হতে পারে। যাইহোক +1 :)
d0rmLife

@ d0rmLife: অন্যান্য উত্তরে আপনার যথেষ্ট ব্যাখ্যা আছে যা বড় ছবিটি কভার করে। আমি কেবল একটি অন্য ভিউ হিসাবে গাণিতিক বিমূর্ত ব্যাখ্যা দিতে চেয়েছি। আইএমএইচওও, এটি &'অ্যাড্রেস' হিসাবে কল করার ক্ষেত্রে কম বিভ্রান্তি তৈরি করবে কারণ সেটির প্রতি পয়েন্টারের চেয়ে কোনও বস্তুর সাথে বেশি আবদ্ধ
অভিজিৎ

কোনও অপরাধ নয়, তবে পর্যাপ্ত ব্যাখ্যা কী তা আমি নিজেই স্থির করব। ডেটা স্ট্রাকচার এবং মেমরির বরাদ্দকে পুরোপুরি ব্যাখ্যা করার জন্য একটি পাঠ্যপুস্তকই যথেষ্ট নয়। ;) .... যাইহোক, আপনার উত্তরটি এখনও সহায়ক , এমনকি এটি উপন্যাস না হলেও।
d0rmLife

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

3

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

প্রযুক্তিগতভাবে, কোনও ঠিকানা সি তে কখনই মান হয় না, কারণ (আইএসও) সি-তে "মান" শব্দের সংজ্ঞা:

কোনও নির্দিষ্ট ধরণের থাকার কারণে যখন ব্যাখ্যা করা হয় তখন কোনও সামগ্রীর সামগ্রীর সুনির্দিষ্ট অর্থ

(আমি জোর দিয়েছি।) তবে সি তে তেমন কোনও "অ্যাড্রেস টাইপ" নেই।

পয়েন্টার এক নয়। পয়েন্টার সি ভাষায় এক প্রকারের । বিভিন্ন স্বতন্ত্র পয়েন্টার প্রকার আছে। তারা অগত্যা ভাষার নিয়মের অভিন্ন সেট মান্য করে না, উদাহরণস্বরূপ বনাম ++মানের কোনও মানের উপর প্রভাব ।int*char*

সি এর মান একটি পয়েন্টার প্রকারের হতে পারে। একে পয়েন্টার মান বলা হয় । স্পষ্ট করে বলতে গেলে, পয়েন্টার মান সি ভাষার কোনও পয়েন্টার নয় is তবে আমরা সেগুলি একসাথে মিশতে অভ্যস্ত, কারণ সিতে এটি অস্পষ্ট হওয়ার সম্ভাবনা নেই: যদি আমরা কোনও অভিব্যক্তিটিকে p"পয়েন্টার" হিসাবে অভিহিত করি তবে এটি কেবলমাত্র একটি পয়েন্টার মান তবে কোনও প্রকার নয়, যেহেতু সি তে একটি নামকরণ করা টাইপ নয় একটি অভিব্যক্তি দ্বারা প্রকাশ করা হয় , তবে একটি টাইপ-নাম বা একটি টাইপডেফ-নাম দ্বারা

কিছু অন্যান্য বিষয় সূক্ষ্ম। একজন সি ব্যবহারকারী হিসাবে প্রথমে আপনার জানা উচিত object:

সম্পাদন পরিবেশে ডেটা সঞ্চয় করার অঞ্চল, এর বিষয়বস্তুতে মানগুলি উপস্থাপন করতে পারে

একটি অবজেক্ট মানগুলি উপস্থাপনের জন্য একটি সত্তা, যা একটি নির্দিষ্ট ধরণের। পয়েন্টার একটি অবজেক্টের ধরণ । সুতরাং আমরা যদি ঘোষণা করি int* p;তবে তার pঅর্থ "পয়েন্টার ধরণের একটি অবজেক্ট" বা একটি "পয়েন্টার অবজেক্ট"।

দ্রষ্টব্য কোনও মানক দ্বারা আদর্শগতভাবে সংজ্ঞায়িত "পরিবর্তনশীল" নেই (বাস্তবে এটি আদর্শিক পাঠ্যে আইএসও সি দ্বারা বিশেষ্য হিসাবে ব্যবহৃত হয় না)। যাইহোক, অনানুষ্ঠানিকভাবে, আমরা কোনও বস্তুকে একটি পরিবর্তনশীল বলি, যেমন অন্য কোনও ভাষা করে। (কিন্তু এখনও তাই ঠিক যেমন C ++ একটি পরিবর্তনশীল হতে পারি রেফারেন্স টাইপ normatively, যা একটি অবজেক্ট নয়।) বাক্যাংশ "পয়েন্টার বস্তুর" বা "পয়েন্টার ভেরিয়েবল" কখনও কখনও মত "পয়েন্টার মান" চিকিত্সা করা হয় উপরে, একটি সঙ্গে সম্ভাব্য সামান্য পার্থক্য। (উদাহরণগুলির আরও একটি সেট হ'ল "অ্যারে"))

যেহেতু পয়েন্টারটি একটি প্রকার, এবং ঠিকানা কার্যকরভাবে সি তে "টাইপলেস", তাই একটি পয়েন্টার মান মোটামুটি একটি ঠিকানা "থাকে"। আর পয়েন্টার টাইপ একটি অভিব্যক্তি করতে উত্পাদ একটি ঠিকানা, যেমন

আইএসও সি 11 6.5.2.3

3 অ্যানারি &অপারেটর তার অপরেন্ডের ঠিকানা দেয়।

দ্রষ্টব্য এই শব্দটি WG14 / N1256, অর্থাৎ আইএসও সি 99: টিসি 3 দ্বারা প্রবর্তিত হয়েছে। C99 এ আছে

3 অ্যানারি &অপারেটর তার অপারেন্ডের ঠিকানা দেয়।

এটি কমিটির মতামত প্রতিফলিত করে: একটি ঠিকানা ইউএনরি অপারেটর কর্তৃক প্রদত্ত পয়েন্টার মান নয়&

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

আইএসও সি 11 6.6

9 একটি স্থির ঠিকানা হ'ল একটি নাল পয়েন্টার, স্থিতিশীল সঞ্চয়স্থানের সময়কালের কোনও অবজেক্টের নকশাকৃত লভালুটির নির্দেশক বা কোনও ফাংশন ডিজাইনারকে নির্দেশক

আইএসও সি ++ 11 5.19

3 ... একটি ঠিকানা ধ্রুবক প্রকাশ হ'ল পয়েন্টার ধরণের একটি মূল মূল ধ্রুবক অভিব্যক্তি যা স্থিতিশীল স্টোরেজ সময়কাল সহ কোনও বস্তুর ঠিকানায়, কোনও ফাংশনের ঠিকানায়, বা একটি নাল পয়েন্টার মানকে, বা একটি মূলমূল স্থির অভিব্যক্তিকে মূল্যায়ন করে প্রকারের std::nullptr_t। ...

(সাম্প্রতিক সি ++ স্ট্যান্ডার্ড খসড়াটি অন্য শব্দ ব্যবহার করে যাতে কোনও সমস্যা হয় না))

আসলে সি তে দুটি "ঠিকানা স্থির" এবং সি ++ তে "অ্যাড্রেস ধ্রুবক অভিব্যক্তি" হ'ল পয়েন্টার ধরণের ধ্রুবক অভিব্যক্তি (বা কমপক্ষে "পয়েন্টার-জাতীয়" প্রকারের সি ++ 11 এর পরে)।

এবং বিল্টিন ইউনিারি &অপারেটরকে সি এবং সি ++ এ "অ্যাড্রেস-অফ" বলা হয়; একইভাবে, std::addressofসি ++ 11 এ চালু করা হয়েছে।

এই নামকরণ ভুল ধারণা আনতে পারে। ফলে অভিব্যক্তি, পয়েন্টার টাইপ, তাই তারা হিসেবে ব্যাখ্যা করা যেতে চাই: ফলাফলের রয়েছে / একটি ঠিকানা উৎপাদ বদলে হয় একটি ঠিকানা।


2

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


2

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


একটি পয়েন্টার একটি ঠিকানা রাখে (বা না হয়, যদি এটি শূন্য হয়)। তবে এটি একটি ঠিকানা হিসাবে এটি অনেক দূরে কান্নাকাটি : উদাহরণস্বরূপ, একই ঠিকানার দুটি পয়েন্টার কিন্তু একটি ভিন্ন ধরণের সহ অনেক পরিস্থিতিতে সমতুল্য নয়।
গিলস

@Gilles যদি আপনি দেখেন "হচ্ছে", হিসাবে int i=5-> আমি হয় 5 তারপর, পয়েন্টার ঠিকানা হবে হ্যাঁ। এছাড়াও নালটিরও একটি ঠিকানা রয়েছে। সাধারণত একটি অবৈধ লেখার ঠিকানা (তবে প্রয়োজনীয় নয়, x86-রিয়েল মোড দেখুন), তবে কোনও ঠিকানা কম নয়। নালটির জন্য সত্যিকারের মাত্র 2 টি প্রয়োজনীয়তা রয়েছে: এটি একটি সত্যিকারের বস্তুর সাথে পয়েন্টারের সাথে অসম তুলনা করার নিশ্চয়তাযুক্ত এবং যে কোনও দুটি নাল পয়েন্টার সমান তুলনা করবে।
ভ্যালেন্টিন রাদু

বিপরীতে, নাল পয়েন্টারটি কোনও বস্তুর ঠিকানার সমান না হওয়ার গ্যারান্টিযুক্ত। একটি নাল পয়েন্টার নির্ধারণ করা অপরিজ্ঞাত আচরণ। "পয়েন্টার ঠিকানা এটি" এই বলে একটি বড় সমস্যা হ'ল তারা ভিন্নভাবে কাজ করে। যদি pকোনও পয়েন্টার p+1হয় তবে ঠিকানাটি সর্বদা 1 দ্বারা
বাড়ানো

মন্তব্যটি আবার পড়ুন it's guaranteed to compare unequal to a pointer to an actual object,। পয়েন্টার গাণিতিক হিসাবে, আমি বিন্দুটি দেখতে পাচ্ছি না, পয়েন্টারের মানটি এখনও একটি ঠিকানা, এমনকি যদি অপারেশনটি এটিতে প্রয়োজনীয়ভাবে একটি বাইট যোগ না করে।
ভ্যালেন্টিন রাদু

1

আমি অন্য উত্তরে দেখিনি ভিন্ন ভিন্ন পয়েন্টার ধরণের কারণে একটি সি বা সি ++ পয়েন্টার একটি সাধারণ মেমরি ঠিকানার থেকে পৃথক অন্য একটি উপায় (তাদের মোট আকারের দিক দিয়ে আমি এটিকে উপেক্ষা করেছি)। তবে এটি সম্ভবত সবচেয়ে গুরুত্বপূর্ণ, কারণ অভিজ্ঞ সি / সি ++ প্রোগ্রামাররা এটির উপরে ভ্রমণ করতে পারে:

সংকলকটি ধরে নিতে পারে যে বেমানান প্রকারের পয়েন্টারগুলি পরিষ্কারভাবে করা সত্ত্বেও একই ঠিকানার দিকে ইঙ্গিত দেয় না, যা এমন আচরণ করতে পারে যা কোনও সাধারণ পয়েন্টার == ঠিকানা মডেল দিয়ে সম্ভব নয়। নিম্নলিখিত কোড বিবেচনা করুন (ধরে নিচ্ছেন sizeof(int) = 2*sizeof(short)):

unsigned int i = 0;
unsigned short* p = (unsigned short*)&i;
p[0]=p[1]=1;

if (i == 2 + (unsigned short)(-1))
{
  // you'd expect this to execute, but it need not
}

if (i == 0)
{
  // you'd expect this not to execute, but it actually may do so
}

মনে রাখবেন যে এর ব্যতিক্রম আছে char*, সুতরাং মানগুলি ব্যবহার করে ব্যবহার char*করা সম্ভব (যদিও খুব বহনযোগ্য নয়)।


0

দ্রুত সংক্ষিপ্তসার: এসি ঠিকানাটি এমন একটি মান যা সাধারণত কোনও নির্দিষ্ট ধরণের সাথে মেশিন-স্তরের মেমরি ঠিকানা হিসাবে উপস্থাপিত হয়।

অযোগ্য শব্দ "পয়েন্টার" অস্পষ্ট। সি এর পয়েন্টার অবজেক্টস (ভেরিয়েবল), পয়েন্টার প্রকার , পয়েন্টার এক্সপ্রেশন এবং পয়েন্টার মান রয়েছে

"পয়েন্টার" শব্দের অর্থ "পয়েন্টার অবজেক্ট" অর্থ ব্যবহার করা খুব সাধারণ, এবং এটি কিছুটা বিভ্রান্তির কারণ হতে পারে - এই কারণেই আমি "পয়েন্টার" বিশেষ্য হিসাবে না বিশেষণ হিসাবে ব্যবহার করার চেষ্টা করি।

সি স্ট্যান্ডার্ড, কমপক্ষে কিছু ক্ষেত্রে "পয়েন্টার" শব্দের অর্থ "পয়েন্টার মান" ব্যবহার করে। উদাহরণস্বরূপ, মলোকের বিবরণ বলে যে এটি "বরাদ্দ স্থানে নাল পয়েন্টার বা পয়েন্টার দেয়" "

সুতরাং সি একটি ঠিকানা কি? এটি একটি পয়েন্টার মান, অর্থাত্ কিছু নির্দিষ্ট পয়েন্টার ধরণের মান। (বাদে কোনও নাল পয়েন্টার মান অবশ্যই কোনও "ঠিকানা" হিসাবে উল্লেখ করা হয় না, কারণ এটি কোনও কিছুর ঠিকানা নয়)।

আনরিটির স্ট্যান্ডার্ডের বর্ণনা & অপারেটরের বলে যে এটি "তার অপারেন্ডের ঠিকানা দেয়"। সি স্ট্যান্ডার্ডের বাইরে, "ঠিকানা" শব্দটি সাধারণত কোনও (শারীরিক বা ভার্চুয়াল) মেমরি ঠিকানা উল্লেখ করতে ব্যবহৃত হয়, সাধারণত আকারে একটি শব্দ থাকে (প্রদত্ত সিস্টেমে "শব্দ" যাই হোক না কেন)।

এসি "ঠিকানা" সাধারণত একটি মেশিনের ঠিকানা হিসাবে প্রয়োগ করা হয় - ঠিক তেমন কোনও সি intমান যেমন একটি মেশিন শব্দ হিসাবে প্রয়োগ করা হয়। তবে একটি সি ঠিকানা (পয়েন্টার মান) কেবল একটি মেশিনের ঠিকানার চেয়ে বেশি। এটি একটি মান সাধারণত মেশিনের ঠিকানা হিসাবে প্রতিনিধিত্ব করে এবং এটি নির্দিষ্ট কিছু ধরণের মান ।


0

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

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

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

সংক্ষেপে, সি লেখকের চেয়ে কোনও ঠিকানার আরও বিমূর্ত ধারণা ব্যবহার করে।

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

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


0

সহজভাবে বলতে গেলে পয়েন্টারগুলি সেগমেন্টেশন মেকানিজমের আসলে অফসেট অংশ যা বিভাজনের পরে লিনিয়ার ঠিকানায় এবং পরে পেজিংয়ের পরে ফিজিকাল ঠিকানায় অনুবাদ করে। শারীরিক ঠিকানাগুলি আপনাকে রাম থেকে সম্বোধন করা হয়।

       Selector  +--------------+         +-----------+
      ---------->|              |         |           |
                 | Segmentation | ------->|  Paging   |
        Offset   |  Mechanism   |         | Mechanism |
      ---------->|              |         |           |
                 +--------------+         +-----------+
        Virtual                   Linear                Physical
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.