পয়েন্টার সি ভাষায় ধারণ করে এমন ডেটার "প্রকার" কী?


30

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


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

29
"ঠিকানাগুলি হেক্সাডেসিমাল ফর্ম্যাটে রয়েছে" না, এটি কেবল ডিবাগার বা একটি লাইব্রেরির বিন্যাস বিট। একই যুক্তি দিয়ে আপনি বলতে পারেন যে তারা বাইনারি বা অষ্টালে রয়েছে।
usr

আপনি ধরণের নয়, ফর্ম্যাটটি সম্পর্কে জিজ্ঞাসা করা ভাল । সুতরাং নীচে কিছু অফ পিস্ট উত্তর ... (যদিও কিলিয়ানস স্পট অন রয়েছে) on
মনিকা

1
আমি মনে করি যে এখানে গভীর সমস্যাটি হ'ল ওপির ধরণের বোঝা । এটি যখন নেমে আসে, আপনি আপনার প্রোগ্রামে যে মানগুলি চালিত করছেন তা কেবল মেমরির বিট। প্রকারগুলি যখন বিধানসভা কোড উত্পন্ন করে তখন সেই বিটগুলি কীভাবে আচরণ করবে তা সংকলককে বলার প্রকারগুলি প্রকারগুলি।
জাস্টিন লার্ডিনয়েস

আমি মনে করি those সমস্ত উত্তর দিয়ে এডিট করতে দেরি হয়েছে, তবে আপনি যদি হার্ডওয়্যার এবং / বা অপারেটিং সিস্টেমকে উদাহরণস্বরূপ "x64 লিনাক্সে" সীমাবদ্ধ রাখতেন তবে এই প্রশ্নটি আরও ভাল হত।
হাইড

উত্তর:


64

পয়েন্টার ভেরিয়েবলের ধরণ হল .. পয়েন্টার।

সিতে আনুষ্ঠানিকভাবে আপনাকে যে ক্রিয়াকলাপের অনুমতি দেওয়া হয় তা হ'ল এটির তুলনা করা (অন্যান্য পয়েন্টারগুলির সাথে, বা বিশেষ ন্যূনেল / শূন্য মানের সাথে), সংখ্যাকে যোগ করা বা বিয়োগ করা, বা অন্য পয়েন্টারে এটি কাস্ট করা।

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

কিছু আর্কিটেকচার রয়েছে যেখানে পয়েন্টারগুলি সহজ নয় কারণ স্মৃতি সমতল নয়। ডস / 8086 'কাছাকাছি' এবং 'দূর'; পিআইসির বিভিন্ন মেমরি এবং কোড স্পেস।


2
আপনাকে দুটি পয়েন্টারের মধ্যে পার্থক্য নেওয়ার অনুমতিও রয়েছে p1-p2। ফলাফলটি একটি স্বাক্ষরিত অবিচ্ছেদ্য মান। বিশেষত,&(array[i])-&(array[j]) == i-j
এমএসএলটার্স

13
আসলে, একটি অবিচ্ছেদ্য টাইপ রূপান্তর এছাড়াও, নির্দিষ্ট করা বিশেষভাবে করতে intptr_tএবং uintptr_tপয়েন্টার মানের জন্য "বড় যথেষ্ট" হতে নিশ্চিত করা হয়।
ম্যাথিউ এম।

3
আপনি কাজ করতে রূপান্তর উপর নির্ভর করতে পারেন, কিন্তু পূর্ণসংখ্যা এবং পয়েন্টার মধ্যে ম্যাপিং বাস্তবায়ন সংজ্ঞায়িত হয়। (একমাত্র ব্যতিক্রম 0 -> নাল, এবং এটি কেবল তখনই নির্দিষ্ট করা হয় যদি 0 টি ধ্রুবক আইআইআরসি হয়))
সিএওও

7
pপ্রিন্টফের সাথে নির্দিষ্টকারীর সংযোজন শূন্য পয়েন্টারের মানব-পঠনযোগ্য উপস্থাপনাটিকে সংজ্ঞায়িত করে তোলে, যদি বাস্তবায়নের উপর নির্ভরশীল আচরণ সি।
ডিএমকেকে

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

44

আপনি অত্যধিক জটিল জিনিস।

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

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

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


26
ঠিকানা সবচেয়ে স্পষ্টভাবে হয় না শুধু পূর্ণসংখ্যার। ফ্লোটিং পয়েন্ট সংখ্যার সবচেয়ে স্পষ্টভাবে হয় ঠিক যেমন না শুধু পূর্ণসংখ্যার।
gnasher729

8
প্রকৃতপক্ষে. সর্বাধিক পরিচিত কাউন্টারিক্স নমুনাটি হ'ল ইন্টেল 8086, যেখানে পয়েন্টার দুটি পূর্ণসংখ্যা।
MSalters

5
@ রব একটি সেগমেন্টযুক্ত মেমোরি মডেলটিতে, পয়েন্টারটি সেগমেন্টের অন্তর্নিহিত একক মান (সেগমেন্টের শুরুর সাথে সম্পর্কিত একটি ঠিকানা; একটি অফসেট), অথবা একটি বিভাগ / নির্বাচক এবং অফসেট জোড়া হতে পারে । (আমি মনে করি ইন্টেল "নির্বাচক" শব্দটি ব্যবহার করেছেন; আমি এটি দেখার পক্ষে খুব অলস)) ৮০৮৮ এ এটিকে দুটি ১ 16-বিট পূর্ণসংখ্যা হিসাবে উপস্থাপন করা হয়েছিল, যা একত্রে একটি 20 বিট শারীরিক ঠিকানা গঠন করেছিল। (হ্যাঁ, আপনি একই রকম মেমোরি সেলটি অনেকগুলি বিভিন্ন উপায়ে সম্বোধন করতে পারতেন, যদি আপনি এতটা ঝোঁক ছিলেন: ঠিকানা = (বিভাগ << 4 + অফসেট)) এবং 0xfffff real
একটি সিভিএন

4
দীর্ঘমেয়াদী একত্রিতকারী প্রোগ্রামার হিসাবে, আমি প্রমাণ করতে পারি যে কম্পিউটারের মেমরিটি পূর্ণসংখ্যার ধারণকারীর মেমরির অবস্থান ছাড়া কিছুই নয়। তবে, আপনি তাদের সাথে কীভাবে আচরণ করছেন এবং সেই পূর্ণসংখ্যাগুলি কী গুরুত্বপূর্ণ তা উপস্থাপন করে। উদাহরণস্বরূপ, আমার সিস্টেমে দশমিক সংখ্যা 4075876853 x'F2F0F1F5 'হিসাবে সঞ্চিত রয়েছে, যা EBCDIC এর' 2015 'স্ট্রিং। দশমিক 2015 টি 000007DF হিসাবে সংরক্ষণ করা হবে যেখানে x'0002015C 'প্যাকড-দশমিক ফর্ম্যাটে দশমিক 2015 উপস্থাপন করে। একত্রিতকারী প্রোগ্রামার হিসাবে, আপনাকে এগুলি অবগত রাখতে হবে; সংকলক এইচএল ভাষাগুলির জন্য এটি করে।
স্টিভ আইভেস

7
ঠিকানাগুলিকে পূর্ণসংখ্যার সাথে একের পর এক যোগাযোগের জন্য রাখা যেতে পারে তবে কম্পিউটারে অন্য সব কিছু হতে পারে :)
হাবস

16

একটি পয়েন্টার ঠিক যে - একটি পয়েন্টার। এটা অন্য কিছু নয়। এটা অন্য কিছু বলে ভাবার চেষ্টা করবেন না।

সি, সি ++, এবং অবজেক্টিভ-সি জাতীয় ভাষায় ডেটা পয়েন্টারগুলির চার ধরণের সম্ভাব্য মান রয়েছে:

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

এছাড়াও ফাংশন পয়েন্টার রয়েছে, যা হয় একটি ফাংশন সনাক্ত করে, বা নাল ফাংশন পয়েন্টার, বা একটি অনির্দিষ্ট মান রয়েছে।

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

কোনও নির্দিষ্ট সংকলক কীভাবে পয়েন্টার প্রয়োগ করে তা আপনি তদন্ত করতে পারেন তবে এটি সম্পূর্ণ ভিন্ন প্রশ্ন।


4
ফাংশনগুলিতে পয়েন্টার রয়েছে এবং সি ++ এ সদস্যদের পয়েন্টার রয়েছে।
sdenham

সদস্যদের সি ++ পয়েন্টারগুলি মেমরি ঠিকানা নয়? অবশ্যই তারা। class A { public: int num; int x; }; int A::*pmi = &A::num; A a; int n = a.*pmi;ভেরিয়েবলটি pmiবেশি ব্যবহার করতে পারে না যদি এতে কোনও মেমরি ঠিকানা না থাকে, যেমন কোডের শেষ লাইনটি শ্রেণীর numউদাহরণের সদস্যের ঠিকানাটি প্রতিষ্ঠিত করে । আপনি এটিকে একটি সাধারণ পয়েন্টারে কাস্ট করতে পারেন (যদিও সংকলক সম্ভবত আপনাকে একটি সতর্কতা দেয়) এবং এটি সফলভাবে অবলম্বন করতে পারে (প্রমাণ করে যে এটি অন্য কোনও পয়েন্টারের জন্য সিনট্যাকটিক চিনি)। aAint
dodgethesteamroller

9

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

যদি আমি মনে করি সঠিকভাবে একটি কম্পিউটার ছিল যা 29 বিট শব্দ ব্যবহার করেছিল; এটি কেবল দু'জনের শক্তি নয়, এটি এমনকি প্রধান। আমি ভেবেছিলাম এটি সিলিয়াক ছিল তবে প্রাসঙ্গিক উইকিপিডিয়া নিবন্ধ এটি সমর্থন করে না। বুস ২৯ বিট ঠিকানা ব্যবহার করতে পারে তবে কনভেনশন দ্বারা নেটওয়ার্ক ঠিকানাগুলি কার্যকরীভাবে অভিন্ন থাকলেও পয়েন্টার হিসাবে উল্লেখ করা হয় না।

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

কখনও কখনও দুজনে মিলে না। প্রারম্ভিক পিসিগুলিতে ঠিকানা বাসটি 24 বিট প্রশস্ত ছিল।


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

@ হাইড - আপনার যুক্তিতে সেই প্রসঙ্গে যোগ্যতা রয়েছে যেখানে আপনি স্পষ্টতই এটি লক্ষ্য করেছিলেন, তবে কম্পিউটারের প্রভাবশালী রূপটি এম্বেডড কন্ট্রোলার, যেখানে ভার্চুয়াল মেমরির মতো মার্ভেলস সীমিত স্থাপনার সাথে সাম্প্রতিক উদ্ভাবন। এছাড়াও, আপনি যা নির্দেশ করেছেন তা কোনওভাবেই ওপিকে পয়েন্টারগুলি বুঝতে সহায়তা করে। আমি ভেবেছিলাম কিছু historicalতিহাসিক প্রেক্ষাপট এটিকে অনেকগুলি স্বেচ্ছাচারিত করে তুলবে।
পিটার উইন

আমি জানি না র‌্যামের কথা বলা ওপিকে বুঝতে সহায়তা করবে কিনা, কারণ প্রশ্নটি নির্দিষ্টভাবে পয়েন্টার আসলে কী তা নিয়ে। ওহ, আর একটি নটপিক, সি পয়েন্টারে সংজ্ঞা দ্বারা বাইটকে নির্দেশ করে (নিরাপদে char*যেমন কাস্ট করা যায় মেমরি অনুলিপি / তুলনা উদ্দেশ্যে, এবং sizeof char==1সি স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত), শব্দ নয় (সিপিইউ শব্দের আকার বাইট আকারের সমান না হলে)।
হাইড

মূলত পয়েন্টারগুলি হ'ল স্টোরেজের জন্য হ্যাশ কীগুলি। এটি ভাষা এবং প্ল্যাটফর্মের আক্রমণকারী।
পিটার উইন

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

6

মূলত প্রতিটি আধুনিক কম্পিউটার একটি বিট-পুশিং মেশিন। সাধারণত এটি ডেটার ক্লাস্টারে প্রায় বিট ঠেলে দেয়, যাকে বলে বাইটস, শব্দ, ডিফলার বা কিওয়ার্ডস।

একটি বাইটে 8 বিট, একটি শব্দ 2 বাইট (বা 16 বিট), একটি শব্দ 2 শব্দ (বা 32 বিট) এবং একটি কিওয়ার্ড 2 ডিওয়ার্ড (বা 64 বিট) থাকে। বিটগুলি সাজানোর একমাত্র উপায় এটি নয়। 128 বিট এবং 256 বিট ম্যানিপুলেশনটি সাধারণত সিমডের নির্দেশাবলীতে ঘটে।

সমাবেশ নির্দেশাবলী রেজিস্টার এবং মেমরি ঠিকানার উপর পরিচালিত হয় উপরের ফর্মগুলির মধ্যে সাধারণত পরিচালনা করে।

ALU (পাটিগণিত যুক্তিযুক্ত ইউনিট) বিটের এমন বান্ডিলগুলিতে এমনভাবে কাজ করে যেমন তারা পূর্ণসংখ্যার প্রতিনিধিত্ব করে (সাধারণত দুটি এর পরিপূরক বিন্যাস), এবং FPU গুলি যেন তারা যেখানে ভাসমান পয়েন্টের মান (সাধারণত আইইইই 754-শৈলী floatএবং double)। অন্যান্য অংশগুলি এমনভাবে কাজ করবে যেমন তারা কিছু ফর্ম্যাট, অক্ষর, টেবিল এন্ট্রি, সিপিইউ নির্দেশাবলী, বা ঠিকানাগুলির বান্ডিল ডেটা।

একটি সাধারণ bit৪ বিট কম্পিউটারে, 8 বাইট (64 বিট) এর বান্ডিলগুলি ঠিকানা হয়। আমরা এই ঠিকানাগুলি হেক্স ফর্ম্যাটের মতো (যেমন 0xabcd1234cdef5678) প্রচলিতভাবে প্রদর্শন করি তবে এটি বিট নিদর্শনগুলি পড়ার জন্য মানুষের পক্ষে সহজ উপায়। প্রতিটি বাইট (8 বিট) দুটি হেক্স অক্ষর হিসাবে লেখা হয় (সমানভাবে প্রতিটি হেক্স অক্ষর - 0 থেকে এফ - 4 বিট উপস্থাপন করে)।

আসলে যা চলছে (আসলে কিছু স্তরের জন্য) এটি হ'ল বিটগুলি সাধারণত একটি রেজিস্টারে সঞ্চিত থাকে বা মেমরি ব্যাঙ্কের সংলগ্ন স্থানে সঞ্চিত থাকে এবং আমরা কেবল তাদের অন্য কোনও মানুষের কাছে বর্ণনা করার চেষ্টা করছি।

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

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

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

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

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

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

এমনকি এটি একটি মিথ্যা।

বিমূর্ততার প্রতিটি স্তর নীচের একটিকে লুকিয়ে রাখে এবং প্রিন্ট আউট করার জন্য ফেনম্যান চিত্রগুলি মনে না রেখে সমস্যা সমাধানের বিষয়ে আপনাকে ভাবতে দেয় "Hello World"

সুতরাং সততার পর্যাপ্ত পর্যায়ে, কম্পিউটারগুলি বিটগুলি পুশ করে এবং সেই বিটগুলি কীভাবে ব্যবহার করা হয় তার দ্বারা অর্থ দেওয়া হয়।


3

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

6.3.2.3 পয়েন্টার

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

  2. যে কোনও পয়েন্টার টাইপ একটি পূর্ণসংখ্যার ধরণে রূপান্তরিত হতে পারে। পূর্বনির্ধারিত ব্যতীত ফলাফলটি বাস্তবায়ন-সংজ্ঞায়িত। যদি ফলাফলটি পূর্ণসংখ্যার ধরণে প্রতিনিধিত্ব না করা যায়, তবে আচরণটি সংজ্ঞায়িত। ফলাফলটি কোনও পূর্ণসংখ্যার ধরণের মানের সীমার মধ্যে থাকা উচিত নয়।

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

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

যদি আমরা সি এর বাইরে দ্রুত এগিয়ে চলে যাই এবং সি ++ স্পেসের দিকে নজর দিই তবে আমরা এর সাথে আরও কিছুটা স্পষ্টতা পাই reinterpret_castতবে এটি ভিন্ন ভাষা, সুতরাং আপনার জন্য এর মান আলাদা হতে পারে:

আইএসও / আইসিসি এন 337: সি ++ 11 খসড়া স্পেসিফিকেশন (আমার কাছে কেবল খসড়াটি হাতে আছে)

5.2.10 কাস্ট পুনরায় ব্যাখ্যা

  1. একটি পয়েন্টারটি সুস্পষ্টভাবে কোনও ধরণের ইন্টিগ্রাল টাইপ করে এটি ধরে রাখার পক্ষে এটি রূপান্তরিত হতে পারে। ম্যাপিং ফাংশনটি বাস্তবায়ন-সংজ্ঞায়িত। [দ্রষ্টব্য: এটি অন্তর্নিহিত মেশিনের ঠিকানা কাঠামোটি জানেন এমন ব্যক্তিদের জন্য উদ্বেগজনক হওয়ার উদ্দেশ্যে করা হয়েছে। শিরোনাম দ্রষ্টব্য] std :: nullptr_t প্রকারের একটি মান একটি অবিচ্ছেদ্য প্রকারে রূপান্তরিত হতে পারে; রূপান্তরটির একই অর্থ এবং বৈধতা রয়েছে (অকার্যকর *) 0 এর সাথে ইন্টিগ্রাল টাইপের রূপান্তর as [দ্রষ্টব্য: একটি পুনরায় ব্যাখ্যা_কাস্ট কোনও ধরণের মানকে std :: nullptr_t প্রকারে রূপান্তর করতে ব্যবহার করা যাবে না। অন্তর্ভুক্ত নোট]

  2. ইন্টিগ্রাল টাইপ বা এনুমুরেশন টাইপের একটি মান স্পষ্টভাবে একটি পয়েন্টারে রূপান্তরিত হতে পারে। একটি পয়েন্টার পর্যাপ্ত আকারের পূর্ণসংখ্যায় রূপান্তরিত হয় (যদি এর বাস্তবায়নের ক্ষেত্রে এমন কোনও উপস্থিত থাকে) এবং একই পয়েন্টার টাইপে ফিরে আসার মূল মূল্য থাকে; পয়েন্টার এবং পূর্ণসংখ্যার মধ্যে ম্যাপিংগুলি অন্যথায় বাস্তবায়ন-সংজ্ঞায়িত। [দ্রষ্টব্য: ৩.7.৪.৩ বর্ণিত ব্যতীত, এই জাতীয় রূপান্তরগুলির ফলাফল নিরাপদে প্রাপ্ত পয়েন্টার মান হবে না। অন্তর্ভুক্ত নোট]

আপনি এখানে দেখতে পাচ্ছেন, এর বেল্টের অধীনে আরও কয়েক বছর ধরে, সি ++ পাওয়া গেছে যে অনুমান করা নিরাপদ ছিল যে পূর্ণসংখ্যার সাথে ম্যাপিংটি বিদ্যমান ছিল, সুতরাং আর অপরিবর্তিত আচরণের কথা নেই (যদিও অংশ 4 এবং এর মধ্যে একটি আকর্ষণীয় দ্বন্দ্ব রয়েছে 5 "শব্দটির প্রয়োগের সাথে" যদি এরকম কিছু থাকে তবে "


এখন আপনি এই থেকে দূরে রাখা উচিত?

  • পয়েন্টারগুলির সঠিক প্রতিনিধিত্ব বাস্তবায়ন সংজ্ঞায়িত। (প্রকৃতপক্ষে, কেবল এটিকে আরও মশগুল করার জন্য, কিছু ছোট এম্বেড করা কম্পিউটার নাল পয়েন্টারটি উপস্থাপন করে, (শূন্য ) 0, ঠিকানা হিসাবে 255 তারা ব্যবহার করে এমন কিছু ঠিকানা আলিয়াজিং ট্রিকস সমর্থন করে) *
  • মেমোরিতে পয়েন্টারগুলির উপস্থাপনা সম্পর্কে যদি আপনাকে জিজ্ঞাসা করতে হয় তবে আপনি সম্ভবত আপনার প্রোগ্রামিং ক্যারিয়ারের এমন কোনও মুহুর্তে নন যেখানে আপনি তাদের সাথে ফিড করতে চান।

সেরা বাজি: একটি (চর *) castালাই। সি এবং সি ++ নির্দিষ্টকরণগুলি অ্যারে এবং স্ট্রাক্টগুলির প্যাকিং নির্দিষ্টকরণের বিধি দ্বারা পরিপূর্ণ এবং উভয়ই সর্বদা কোনও চরিত্রের জন্য একটি চরকে ingালাই মঞ্জুরি দেয়। চরটি সর্বদা 1 বাইট (সি তে গ্যারান্টিযুক্ত নয়, তবে সি ++ 11 দ্বারা এটি ভাষার বাধ্যতামূলক অংশে পরিণত হয়েছে, তাই এটি সর্বত্র সর্বত্র 1 বাইট বলে ধরে রাখার তুলনামূলক নিরাপদ)। এটি আপনাকে পয়েন্টারগুলির বাস্তবায়নের নির্দিষ্ট প্রতিনিধিত্বগুলি জানতে প্রয়োজনের অবলম্বন ছাড়াই বাইট বাই বাই স্তরে কিছু পয়েন্টার পাটিগণিত করতে দেয়।


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

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

একজন charসবসময় 1 সি সি মান থেকে বরাত দিয়ে এ বাইট: "যাও sizeof অপারেটর আকার উৎপাদ (বাইটে) তার প্রতীক এর" এবং "যাও sizeof অপেরান্ড আছে টাইপ গৃহস্থালির কাজ, স্বাক্ষরবিহীন গৃহস্থালির কাজ, বা স্বাক্ষর গৃহস্থালির কাজ প্রয়োগ করা হয়, তখন (বা এর একটি যোগ্য সংস্করণ) ফলাফলটি ১। " সম্ভবত আপনি ভাবছেন একটি বাইট 8 বিট দীর্ঘ। যে অগত্যা হয় না। মানটির সাথে সামঞ্জস্যপূর্ণ হতে, একটি বাইটে কমপক্ষে 8 বিট থাকতে হবে।
ডেভিড হ্যামেন

অনুমানটি পয়েন্টার এবং পূর্ণসংখ্যার প্রকারের মধ্যে রূপান্তরকে বর্ণনা করে । এটি সর্বদা মাথায় রাখা উচিত যে প্রকারের মধ্যে "রূপান্তর" ধরণের সমতার ইঙ্গিত দেয় না, এমনকি মেমরিতে দুটি ধরণের বাইনারি উপস্থাপনার একই বিট প্যাটার্নও থাকতে পারে। (এএসসিআইআইটি ইবিসিডিআইকে "রূপান্তরিত" হতে পারে Big বিগ-এন্ডিয়ানকে "লিটল এন্ডিয়ান" রূপান্তর করা যায়
t

1

বেশিরভাগ আর্কিটেকচারে, পয়েন্টারটির ধরণটি মেশিন কোডে অনুবাদ হয়ে গেলে (সম্ভবত "ফ্যাট পয়েন্টার" ব্যতীত) উপস্থিত হয়ে যায়। সুতরাং, একটি পয়েন্টার একটি পয়েন্টার intথেকে একটি পয়েন্টার থেকে doubleঅন্তত তার নিজের থেকে পৃথক করা যাবে । *

[*] যদিও, আপনি এর প্রয়োগের ধরণের ভিত্তিতে এখনও অনুমান করতে পারেন।


1

সি এবং সি ++ সম্পর্কে একটি গুরুত্বপূর্ণ বিষয় হ'ল আসলে কী ধরণের। তারা সত্যিই যা করে তা বিট / বাইটের সেটকে কীভাবে ব্যাখ্যা করতে হয় তা সংকলককে নির্দেশ করে। নিম্নলিখিত কোড দিয়ে শুরু করা যাক:

int var = -1337;

আর্কিটেকচারের উপর নির্ভর করে, একটি পূর্ণসংখ্যাকে সাধারণত 32 মানগুলি সঞ্চয় করতে স্থান দেওয়া হয়। এর অর্থ হ'ল মেমরির যে স্থানটি ভার সঞ্চিত আছে সেটিকে "11111111 11111111 11111010 11000111" বা হেক্স "0xFFFFF77" এর মতো কিছু দেখাবে। এটাই. এটাই সেই স্থানে সঞ্চিত। সমস্ত ধরণের কাজটি কম্পাইলারকে সেই তথ্যটির কীভাবে ব্যাখ্যা করতে হয় তা বলা হয়। পয়েন্টার আলাদা নয়। আমি যদি এরকম কিছু করি:

int* var_ptr = &var;   //the ampersand is telling C "get the address where var's value is located"

তারপরে সংকলকটি var এর অবস্থান পাবে এবং তারপরে সেই ঠিকানাটি একই কোডে সংরক্ষণ করবে প্রথম কোড স্নিপেট মান -1337 সংরক্ষণ করে। এগুলি কীভাবে সংরক্ষণ করা হয় তার মধ্যে কোনও পার্থক্য নেই, কেবল সেগুলি কীভাবে ব্যবহৃত হয় in এটি এমনকি কোনও ব্যাপার নয় যে আমি var_ptr কে কোন int এর জন্য একটি পয়েন্টার তৈরি করেছি। আপনি যদি চান, আপনি করতে পারে।

unsigned int var2 = *(unsigned int*)var_ptr;

এটি বর্ণের উপরের হেক্স মান (0xFFFFFF77) কে সেই স্থানে অনুলিপি করবে যা var2 এর মান সঞ্চয় করে। যদি আমরা তখন var2 ব্যবহার করতে পারি তবে আমরা দেখতে পেতাম যে মানটি 4294965959 হবে var ভার্ 2 এর বাইটগুলি ভের মতোই তবে সংখ্যাটির মান পৃথক। সংকলকটি তাদের আলাদা ব্যাখ্যা করেছিল কারণ আমরা এটি জানিয়েছি যে এই বিটগুলি স্বাক্ষরবিহীন দীর্ঘকে উপস্থাপন করে। আপনি পয়েন্টার মানের জন্যও এটি করতে পারেন could

unsigned int var3 = (unsigned int)var_ptr;

আপনি এই উদাহরণটিতে স্বাক্ষরযুক্ত স্বাক্ষর হিসাবে ভের ঠিকানাটির প্রতিনিধিত্ব করে এমন মানটির ব্যাখ্যা দিয়ে শেষ করবেন।

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


1

পূর্ণসংখ্যা।

একটি কম্পিউটারে ঠিকানা স্থানটি 0 থেকে শুরু করে ক্রমিকভাবে সংখ্যাযুক্ত হয় এবং 1 দিয়ে বৃদ্ধি হয় So


1

প্রকার একত্রিত।

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

একটি চলক যা চরকে পয়েন্টার ধরে রাখতে ঘোষিত হয় তাতে "পয়েন্টার থেকে চর" টাইপ থাকে। একটি ভেরিয়েবল যা পয়েন্টারকে ইন্ট পয়েন্টার ধরে রাখার জন্য ঘোষিত হয় তাতে "পয়েন্টার থেকে ইন্টি পয়েন্টার" টাইপ থাকে।

একটি (মান) টাইপের "পয়েন্টার থেকে পয়েন্টার টু ইনট" টাইপকে একটি বিন্যাস ক্রিয়াকলাপ দ্বারা "পয়েন্টার টু ইনট" তে পরিবর্তন করা যেতে পারে। সুতরাং, প্রকারের ধারণাটি কেবল শব্দ নয়, একটি গাণিতিকভাবে তাৎপর্যপূর্ণ নির্মাণ যা এই ধরণের মানগুলির সাথে আমরা কী করতে পারি তা নির্দেশ করে (যেমন ডিরিফারেন্স, বা প্যারামিটার হিসাবে পাস বা ভেরিয়েবলকে নির্ধারণ করে; এটিও আকার (বাইট গণনা) নির্ধারণ করে সূচক, গাণিতিক এবং বৃদ্ধি / হ্রাস ক্রিয়াকলাপ)।

পিএস যদি আপনি বিভিন্ন ধরণের গভীরে যেতে চান তবে এই ব্লগটি ব্যবহার করে দেখুন: http://www.goodmath.org/blog/2015/05/13/expression-and-arity-part-1/

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