দ্রষ্টব্য: এই উত্তরটি C ++ নয়, C ভাষার ক্ষেত্রে প্রযোজ্য।
নাল পয়েন্টার
পূর্ণসংখ্যার ধ্রুবক আক্ষরিক 0
বিভিন্ন প্রকারে এটি ব্যবহৃত হয়েছে সেই প্রসঙ্গে নির্ভর করে ings সব ক্ষেত্রে, এটি মান সহ এখনও একটি পূর্ণসংখ্যক ধ্রুবক 0
, এটি কেবল বিভিন্ন উপায়ে বর্ণনা করা হয়েছে।
যদি কোনও পয়েন্টারকে ধ্রুবক আক্ষরিক সাথে তুলনা করা হয় 0
, তবে এটি পয়েন্টারটি নাল পয়েন্টার কিনা তা দেখার জন্য এটি একটি চেক। এটি 0
পরে নাল পয়েন্টার ধ্রুবক হিসাবে উল্লেখ করা হয়। সি স্ট্যান্ডার্ড সংজ্ঞা দেয় যে 0
প্রকারটিতে cast ালাই void *
একটি নাল পয়েন্টার এবং নাল পয়েন্টার ধ্রুবক উভয়ই।
অতিরিক্তভাবে, পাঠযোগ্যতার সহায়তা করতে, ম্যাক্রোটি NULL
শিরোনাম ফাইলটিতে সরবরাহ করা হয় stddef.h
। আপনার সংকলকটির উপর নির্ভর করে #undef NULL
এটি অবাস্তব কিছুতে এটি পুনরায় সংজ্ঞায়িত করা এবং সম্ভব হতে পারে ।
সুতরাং, নাল পয়েন্টারটি পরীক্ষা করার জন্য এখানে কিছু বৈধ উপায় রয়েছে:
if (pointer == NULL)
NULL
একটি নাল পয়েন্টারের সমান তুলনা করতে সংজ্ঞায়িত করা হয়। এটি বাস্তবায়ন সংজ্ঞায়িত হয় প্রকৃত সংজ্ঞাটি NULL
কী, যতক্ষণ না এটি বৈধ নাল পয়েন্টার ধ্রুবক।
if (pointer == 0)
0
নাল পয়েন্টার ধ্রুবকের আরেকটি উপস্থাপনা।
if (!pointer)
এই if
বিবৃতি সুস্পষ্টভাবে "0 নয়" যাচাই করে, তাই আমরা এর বিপরীতে "0 হয়"।
নাল পয়েন্টারটি পরীক্ষা করার জন্য নীচেরগুলি অন্তর্ভুক্ত উপায়গুলি:
int mynull = 0;
<some code>
if (pointer == mynull)
সংকলকটির কাছে এটি নাল পয়েন্টারটির জন্য চেক নয়, তবে দুটি ভেরিয়েবলের জন্য একটি সমতা চেক। এটি কাজ করতে পারে যদি মাইনুল কখনই কোডে পরিবর্তন না করে এবং সংকলক অপ্টিমাইজেশানগুলি ধ্রুবকটিকে যদি স্টেট স্টেটমেন্টে 0 বার করে দেয় তবে এটি গ্যারান্টিযুক্ত নয় এবং সংকলককে সি স্ট্যান্ডার্ড অনুযায়ী কমপক্ষে একটি ডায়াগনস্টিক বার্তা (সতর্কতা বা ত্রুটি) তৈরি করতে হবে।
দ্রষ্টব্য যে সি ভাষায় একটি নাল পয়েন্টার কি। অন্তর্নিহিত আর্কিটেকচারে এটি কোনও ব্যাপার নয়। অন্তর্নিহিত আর্কিটেকচারের যদি ঠিকানা 0xDEADBEEF হিসাবে নির্ধারিত একটি নাল পয়েন্টার মান থাকে, তবে এই জগাখিচুড়িটি সাজানোর জন্য এটি সংকলকটির উপর নির্ভর করবে।
যেমন, এই মজার আর্কিটেকচারেও, নীচের উপায়গুলি নাল পয়েন্টারটি পরীক্ষা করার জন্য এখনও বৈধ উপায়:
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
নাল পয়েন্টারটি পরীক্ষা করার জন্য নীচেরগুলি অন্তর্ভুক্ত উপায়গুলি:
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
এগুলি সাধারণ তুলনা হিসাবে একটি সংকলক দ্বারা দেখা হয়।
নাল অক্ষর
'\0'
নাল অক্ষর হিসাবে সংজ্ঞায়িত - এটি শূন্যে সেট সমস্ত বিট সহ একটি অক্ষর। পয়েন্টারগুলির সাথে এটির কোনও সম্পর্ক নেই। তবে আপনি এই কোডটির অনুরূপ কিছু দেখতে পাচ্ছেন:
if (!*string_pointer)
স্ট্রিং পয়েন্টারটি নাল চরিত্রের দিকে নির্দেশ করছে কিনা তা পরীক্ষা করে
if (*string_pointer)
স্ট্রিং পয়েন্টারটি একটি নন-নাল অক্ষরে নির্দেশ করছে কিনা তা পরীক্ষা করে
এগুলি নাল পয়েন্টারগুলির সাথে বিভ্রান্ত করবেন না। বিট উপস্থাপনাটি একই কারণ এবং এটি কিছু ক্ষেত্রে কেটে সুবিধাজনক ক্রস করার অনুমতি দেয়, তারা আসলে একই জিনিস নয়।
অতিরিক্ত হিসাবে, '\0'
মান শূন্য সহ এই ক্ষেত্রে (সমস্ত চরিত্রের অক্ষরের মতো) একটি পূর্ণসংখ্যার ধ্রুবক। সুতরাং '\0'
সম্পূর্ণ অপরিবর্তিত 0
পূর্ণসংখ্যার ধ্রুবকের সমতুল্য - একমাত্র পার্থক্য হ'ল এটি একটি মানব পাঠকের কাছে পৌঁছে দেওয়ার উদ্দেশ্যে ("আমি এটিকে নাল চরিত্র হিসাবে ব্যবহার করছি।")।
তথ্যসূত্র
আরও জানতে comp.lang.c FAQ এর 5.3 প্রশ্ন দেখুন। সি স্ট্যান্ডার্ডের জন্য এই পিডিএফটি দেখুন । বিভাগ 6.3.2.3 পয়েন্টার, অনুচ্ছেদ 3 দেখুন।