NULL, '\ 0' এবং 0 এর মধ্যে পার্থক্য কী?


309

সি তে, শূন্যের বিভিন্ন মানের - NULL, NULএবং এর মধ্যে পার্থক্য দেখা যায় 0

আমি জানি যে ASCII চরিত্রটি '0'মূল্যায়ন করে 48বা করে 0x30

NULLপয়েন্টার সাধারণত হিসাবে সংজ্ঞায়িত করা হয়:

#define NULL 0

অথবা

#define NULL (void *)0

তদুপরি, NULচরিত্রটিও '\0'যা মূল্যায়ন করতে পারে বলে মনে হয় 0

এই তিনটি মান সমান হতে পারে না যখন সময় আছে?

এটি কি 64 বিট সিস্টেমে সত্য?


1
0 এবং NULL এর মধ্যে পার্থক্য সম্পর্কে আরও কিছু তথ্যের জন্য stackoverflow.com/questions/176989/… দেখুন ।
ডেভিড রদ্রিগেজ - ড্রিবিস

7
NULসি স্ট্যান্ডার্ড ভাষা বা লাইব্রেরিতে (অথবা আমি যতদূর জানি সি ++ তে) সনাক্তকারীটির অস্তিত্ব নেই। নাল চরিত্রটিকে কখনও কখনও NUL বলা হয়, তবে এটি সি বা সি ++ এটি সাধারণত উল্লেখ করা হয় '\0'
কিথ থম্পসন

উত্তর:


351

দ্রষ্টব্য: এই উত্তরটি 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 দেখুন।


3
FAQ তালিকার দিকে নির্দেশ করার জন্য ধন্যবাদ। তবে, c-faq.com/null/nullor0.html দেখুন
সিনান Ünür

4
না, আপনি তুলনা করা হবে না ptrকরতে অল-বিট-জিরো । এটি একটি নয় memcmp, তবে এটি বিল্টিন অপারেটর ব্যবহার করে তুলনা। এক দিকটি নাল পয়েন্টার ধ্রুবক '\0', এবং অন্য দিকটি একটি পয়েন্টার। Aswell সঙ্গে অন্য দুটি সংস্করণের সাথে যেমন NULLএবং 0। তিনজন একই জিনিস করে।
জোহানেস স্কাউব -

6
আপনি বিল্টিন তুলনা অপারেটরটিকে এমন একটি জিনিস হিসাবে নিচ্ছেন যা বিট-স্ট্রিংগুলির তুলনা করবে। তবে তা যা তা নয়। এটি দুটি মানগুলির সাথে তুলনা করে, যা বিমূর্ত ধারণা। একটি নাল পয়েন্টার হিসাবে অভ্যন্তরীণভাবে প্রতিনিধিত্ব করা হয় তাই 0xDEADBEEFএখনও একটি নাল পয়েন্টার, সেটা ব্যাপার তার bitstring দেখে মনে হচ্ছে কি, এবং এটি এখনও সমান তুলনা করবে NULL, 0, \0এবং সমস্ত অন্যান্য নাল পয়েন্টার ধ্রুবক ধরনের।
জোহানেস স্কাউব -

2
আপনি তুলনা অপারেটর সম্পর্কে একটি ভাল বক্তব্য। আমি সি 99 তে উঠে এসেছি। এটিতে "মান 0 সহ একটি পূর্ণসংখ্যক ধ্রুবক অভিব্যক্তি বা শূন্য * টাইপ করার জন্য এই জাতীয় এক্সপ্রেশনকে নাল পয়েন্টার ধ্রুবক বলা হয়।" এটি আরও বলে যে একটি চরিত্র আক্ষরিক একটি পূর্ণসংখ্যার ধ্রুবক প্রকাশ is সুতরাং, ট্রানজিটিভ সম্পত্তি দ্বারা আপনি ঠিক যে ptr == '\0'
অ্যান্ড্রু কিটন

2
".... এটি সম্ভব হয়েছে # অদূরে NFL করা এবং এটি অসম্পূর্ণ কিছুতে নতুনভাবে সংজ্ঞায়িত করা সম্ভব। যে কেউ এই কাজ করে তাকে গুলি করার দাবি করা হয়।" এই আমার ভাল স্যার আমাকে উচ্চস্বরে হাসতে হাসতে ...
oggiemc

34

এটি প্রদর্শিত হয় যে বেশিরভাগ লোক NUL, '\ 0' এবং 0 এর মধ্যে পার্থক্য কী তা ভুল বুঝে। সুতরাং, ব্যাখ্যা করার জন্য এবং আগে বলা জিনিসগুলি পুনরাবৃত্তি করা এড়াতে চেষ্টা করুন:

intমান 0, বা এই ধরণের একটি এক্সপ্রেশন সহ ধরণের ধ্রুবক প্রকাশ void *হ'ল একটি নাল পয়েন্টার ধ্রুবক , যা পয়েন্টারে রূপান্তরিত হলে নাল পয়েন্টার হয়ে যায় । এটি কোনও মানককে কোনও অবজেক্ট বা ফাংশনের সাথে পয়েন্টারের সাথে অসম তুলনা করার গ্যারান্টিযুক্ত ।

NULLএকটি ম্যাক্রো, নাল পয়েন্টার ধ্রুবক হিসাবে সংজ্ঞায়িত ।

\0নাল চরিত্রের প্রতিনিধিত্ব করতে ব্যবহৃত একটি নির্মাণ যা কোনও স্ট্রিং শেষ করতে ব্যবহৃত হয়।

একটি নাল চরিত্র একটি বাইট যা তার সমস্ত বিট 0 এ সেট করা আছে নয়।


14

তিনটিই বিভিন্ন প্রসঙ্গে শূন্যের অর্থ সংজ্ঞায়িত করে।

  • পয়েন্টার প্রসঙ্গে - NULL ব্যবহৃত হয় এবং এর অর্থ পয়েন্টারের মান 0 হয়, এটি 32 বিট বা 64 বিট (এক ক্ষেত্রে 4 অন্য শূন্যের 8 বাইট বাইট) হয় কিনা তা থেকে পৃথক।
  • স্ট্রিং প্রসঙ্গ - অঙ্কের শূন্যের প্রতিনিধিত্বকারী চরিত্রটির 0x30 এর হেক্স মান হয়, যখন NUL বর্ণের 0x00 এর হেক্স মান হয় (স্ট্রিংগুলি সমাপ্ত করার জন্য ব্যবহৃত হয়)।

আপনি স্মৃতির দিকে তাকালে এই তিনটি সর্বদা পৃথক থাকে:

NULL - 0x00000000 or 0x00000000'00000000 (32 vs 64 bit)
NUL - 0x00 or 0x0000 (ascii vs 2byte unicode)
'0' - 0x20

আমি আশা করি এটি এটি পরিষ্কার করে দিয়েছে।


8
নাসকো: মূল্যায়ন করুন sizeof('\0')এবং অবাক হোন ।
ক্যাফে

3
@ নাসকো: আমি সত্যিই অবাক হয়েছিলাম: সিসিতে, সি: আকারে ('\ 0') == আকারে ('এ') == ৪, সি ++ এর সাথে, সাইজেরফ: ('\ 0') == আকারে ('এ') == 1
ডেভিড রদ্রিগেজ - ড্রিবাস

1
@ নাসকো: সি স্ট্যান্ডার্ড থেকে (খসড়া, n1124): 'একটি পূর্ণসংখ্যার অক্ষর ধ্রুব ধরণের টাইপ থাকে int', সুতরাং '\ 0' আসলে সি তে টাইপ ইন্ট টাইপ হয়, এবং এইভাবে আকার ('\ 0') আমার আর্কিটেকচারে 4 হয় (লিনাক্স, 32 বিট)
ডেভিড রদ্রিগেজ - ড্রিবিস

@ ডিরিবিস - আমি এটিকে ধ্রুবক হিসাবে বর্ণনা করছিলাম না, বরং আপনি স্ট্রিংয়ের অংশ হিসাবে কী দেখবেন। আমি স্পষ্টত এটি স্পষ্ট করতে পারে। ধন্যবাদ
নাসকো

@ ডেভিডরডগ্রিজেজ-ড্রিবিয়াস সম্পাদনা বাতিল করুন "0x20 (ডিসেম্বর 32)"
এএসসিআই'র

6

যদি NULL এবং 0 টি নাল পয়েন্টার ধ্রুবক হিসাবে সমতুল্য হয় তবে আমার কোনটি ব্যবহার করা উচিত? সি এফএকিউ তালিকায় এই সমস্যাটিকেও সম্বোধন করে:

সি প্রোগ্রামার বুঝতে হবে NULLএবং 0পয়েন্টার প্রেক্ষিতে বিনিমেয়, এবং একটি uncast যে 0 পুরোপুরি গ্রহণযোগ্য। NULL এর যেকোন ব্যবহারকে (বিপরীতে 0) মৃদু অনুস্মারক হিসাবে বিবেচনা করা উচিত যা কোনও পয়েন্টার জড়িত; প্রোগ্রামারগুলিকে পয়েন্টার 0এর পূর্ণসংখ্যার থেকে আলাদা করার জন্য এটির (তার নিজস্ব বোঝার জন্য বা সংকলকটির জন্য) নির্ভর করা উচিত নয় 0

এটা শুধুমাত্র পয়েন্টার প্রেক্ষিতে যে হয় NULLএবং 0সমতুল্য। NULLঅন্য ধরণের 0প্রয়োজন হলে এটি ব্যবহার করা উচিত নয় , যদিও এটি কাজ করতে পারে, কারণ এটি করা ভুল স্টাইলিস্টিক বার্তাটি প্রেরণ করে। (তদ্ব্যতীত, এএনএসআই হ'ল সংজ্ঞাটি NULLহতে দেয় ((void *)0), যা বিন্দুবিহীন প্রেক্ষাপটে মোটেও কাজ করবে না)) বিশেষত, NULLযখন ASCII নাল অক্ষর ( NUL) পছন্দ হয় তখন ব্যবহার করবেন না । আপনার নিজস্ব সংজ্ঞা প্রদান করুন

#define NUL '\0'

আপনি যদি অবশ্যই।


5

NULL, '\ 0' এবং 0 এর মধ্যে পার্থক্য কী

"নাল ক্যারেক্টার (এনএলইউ)" রায় দেওয়া সহজ। '\0'একটি চরিত্র আক্ষরিক। সি তে, এটি বাস্তবায়িত হয় int, সুতরাং, এটি 0 এর সমান, যা এটি INT_TYPE_SIZE। সি ++ এ, অক্ষর আক্ষরিক হিসাবে প্রয়োগ করা হয় char, যা 1 বাইট। এটি সাধারণত NULLবা এর থেকে পৃথক 0

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

অবশেষে, আক্ষরিক 0ধরনের হয় int, আকারের যা INT_TYPE_SIZEINT_TYPE_SIZEস্থাপত্যের উপর নির্ভর করে এর ডিফল্ট মান আলাদা হতে পারে different

অ্যাপল লিখেছেন:

ম্যাক ওএস এক্স দ্বারা ব্যবহৃত 64-বিট ডেটা মডেল "এলপি 64" নামে পরিচিত। এটি সাধারণ and এলপি data model ডেটা মডেল আদিম ধরণের সংজ্ঞাগুলি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করেছে:

  • ints 32-বিট হয়
  • লম্বা 64৪ বিট হয়
  • দীর্ঘ-দীর্ঘতরগুলিও 64৪-বিট
  • পয়েন্টারগুলি 64-বিট হয়

উইকিপিডিয়া -৪-বিট :

মাইক্রোসফ্টের ভিসি ++ সংকলক এলএলপি 64 মডেল ব্যবহার করে।

64-bit data models
Data model short int long  long long pointers Sample operating systems
LLP64      16    32  32    64        64       Microsoft Win64 (X64/IA64)
LP64       16    32  64    64        64       Most Unix and Unix-like systems (Solaris, Linux, etc.)
ILP64      16    64  64    64        64       HAL
SILP64     64    64  64    64        64       ?

সম্পাদনা করুন : আক্ষরিক চরিত্রটিতে আরও যুক্ত করা হয়েছে।

#include <stdio.h>

int main(void) {
    printf("%d", sizeof('\0'));
    return 0;
}

উপরের কোডটি জিসিসিতে 4 এবং জি ++ এ 1 প্রদান করে।


2
না, '\0'হয় না একটি 1 বাইট মান। এটি একটি অক্ষর আক্ষরিক, যা একটি পূর্ণসংখ্যার ধ্রুবক প্রকাশ - সুতরাং যদি এটির একটি আকার বলা যায় তবে এটি কোনও আকারের int(যা কমপক্ষে 2 বাইট হতে হবে) আকার । আপনি যদি আমাকে বিশ্বাস না করেন, মূল্যায়ন করুন sizeof('\0')এবং নিজের জন্য দেখুন। '\0', 0এবং 0x0সমস্ত সম্পূর্ণ সমতুল্য।
ক্যাফে

@ ক্যাফ এটি ভাষার উপর নির্ভর করে। আপনি যদি আমাকে বিশ্বাস না করেন তবে sizeof('\0')একটি সি ++ সংকলক ব্যবহার করে দেখুন।
ইউজিন ইওকোটা

2
আকার (কিছু) মুদ্রণের সময় আপনার "% zu" ব্যবহার করা উচিত
26:48


4

একটি ভাল অংশ যা সি দিয়ে শুরু করার সময় আমাকে সহায়তা করে (লিন্ডেন দ্বারা বিশেষজ্ঞ সি প্রোগ্রামিং থেকে নেওয়া)

এক 'l' নুল এবং দুটি 'l' নাল

পয়েন্টার এবং এএসসিআইআই শূন্যের সঠিক পরিভাষাটি স্মরণ করতে এই ছোট ছড়াটি মুখস্থ করুন:

The one "l" NUL ends an ASCII string,

The two "l" NULL points to no thing.

Apologies to Ogden Nash, but the three "l" nulll means check your spelling. 

শূন্যের বিট প্যাটার্ন সহ ASCII চরিত্রটিকে "NUL" আখ্যা দেওয়া হয়। বিশেষ পয়েন্টার মানটির অর্থ পয়েন্টারটি পয়েন্টারটি কোথাও "NULL" নয়। দুটি পদ অর্থের বিনিময়যোগ্য নয়।


অনেক সহজ: NULযেমন একটি নিয়ন্ত্রণ কোড BEL, VT, HT, SOTইত্যাদি এবং এইভাবে সর্বোচ্চ হয়েছে। 3 টি অক্ষর।
glglgl

2

"NUL" 0 নয়, তবে ASCII NUL চরিত্রটিকে বোঝায়। কমপক্ষে, আমি এটি ব্যবহার করে দেখেছি। নাল পয়েন্টারটি প্রায়শই 0 হিসাবে সংজ্ঞায়িত করা হয় তবে এটি আপনি যে পরিবেশে চলছে তার উপর নির্ভর করে এবং আপনি যে অপারেটিং সিস্টেম বা ভাষা ব্যবহার করছেন তার স্পেসিফিকেশন।

এএনএসআই সি-তে নাল পয়েন্টারটিকে পূর্ণসংখ্যা মান 0 হিসাবে নির্দিষ্ট করা হয়। সুতরাং যে কোনও বিশ্ব যেখানে সত্য নয় এটিএনএসআই সি অনুসারে নয়।


1

এর মান সহ একটি বাইট 0x00হল, ASCII টেবিলের উপর, বিশেষ অক্ষর NULবা বলা হয় NULL। সিতে, যেহেতু আপনার উত্স কোডে আপনার নিয়ন্ত্রণের অক্ষরগুলি এম্বেড করা উচিত নয়, এটি সি স্ট্রিংগুলিতে একটি পালানো 0, অর্থাৎ, দিয়ে প্রতিনিধিত্ব করা হয় \0

তবে সত্যিকারের NULL হয় না একটি মান। এটি একটি মান অনুপস্থিতি। পয়েন্টারের জন্য, এর অর্থ পয়েন্টারের কাছে নির্দেশ করার মতো কিছুই নেই। একটি ডাটাবেসে, এর অর্থ একটি ক্ষেত্রের কোনও মূল্য নেই (যা ক্ষেত্রটি ফাঁকা, 0, বা স্পেসে ভরাট বলে বলার মতো নয়)।

প্রকৃত মান একটি প্রদত্ত সিস্টেম বা ডাটাবেসের ফাইল ফরম্যাট প্রতিনিধিত্ব করতে একটি ব্যবহার NULLঅগত্যা নয় 0x00


0

NULL0 হওয়ার নিশ্চয়তা নেই - এর সঠিক মানটি আর্কিটেকচার নির্ভর dependent বেশিরভাগ প্রধান স্থাপত্যগুলি এটির সংজ্ঞা দেয় (void*)0

'\0' সর্বদা 0 এর সমান হবে, কারণ এইভাবে বাইট 0 কে একটি অক্ষরে অক্ষরে ইনকোড করা হয়।

আমি মনে করি না সি কম্পাইলারদের এসকিআইআই ব্যবহার করা দরকার কিনা - যদি না হয় তবে '0'সর্বদা 48 এর সমান হয় না। যাইহোক, আপনি সম্ভবত এমন কোনও সিস্টেমের মুখোমুখি হবেন না যে আপনি ইবিসিডিকের মতো বিকল্প চরিত্র সেট ব্যবহার করেন যদি না আপনি খুব কাজ করে থাকেন অস্পষ্ট সিস্টেম

বিভিন্ন ধরণের আকারগুলি 64৪-বিট সিস্টেমে পৃথক হবে তবে পূর্ণসংখ্যা মানগুলি একই হবে।


কিছু মন্তব্যকারী সন্দেহ নেই যে শূন্য 0 সমান হতে, কিন্তু না প্রকাশ করেছেন হতে শূন্য। এই জাতীয় সিস্টেমে প্রত্যাশিত আউটপুট সহ এখানে একটি উদাহরণ প্রোগ্রাম রয়েছে:

#include <stdio.h>

int main () {
    size_t ii;
    int *ptr = NULL;
    unsigned long *null_value = (unsigned long *)&ptr;
    if (NULL == 0) {
        printf ("NULL == 0\n"); }
    printf ("NULL = 0x");
    for (ii = 0; ii < sizeof (ptr); ii++) {
        printf ("%02X", null_value[ii]); }
    printf ("\n");
    return 0;
}

এই প্রোগ্রামটি মুদ্রণ করতে পারে:

NULL == 0
NULL = 0x00000001

2
ওপি '0' (শূন্য চরিত্র) নয়, '\ 0' (এনইউএল চরিত্র) সম্পর্কে জিজ্ঞাসা করছিল
ক্রিস লুটজ

2
@ ক্রিস: '\ 0' নুল নয়, এটি অক্ষরে অক্ষরে অক্ষরে অক্ষরে 0 টি এনকোড করা হয়।
জন মিলিকিন

2
সি ++ এ, মানটি গ্যারান্টি দেয় যে পূর্ণসংখ্য মান 0 থেকে পয়েন্টার রূপান্তরটি সর্বদা নাল পয়েন্টার উপার্জন করবে। সি ++ এ 0 টি নাল পয়েন্টার হওয়ার গ্যারান্টিযুক্ত, অন্যদিকে NULL হ'ল ম্যাক্রো এবং দূষিত কোডার এটি আলাদা কিছু হিসাবে পুনরায় সংজ্ঞায়িত করতে পারে।
ডেভিড রদ্রিগেজ - ড্রিবিস

6
এবং NULL 0 হওয়ার গ্যারান্টিযুক্ত NULL পয়েন্টারের বিট প্যাটার্নটি সমস্ত শূন্য হওয়ার গ্যারান্টিযুক্ত নয়, তবে NULL ধ্রুবকটি রয়েছে এবং সর্বদা 0 থাকবে
জাল্ফ

2
আপনার প্রথম বাক্যটি ভুল - সিআর+ এ NULL (অকার্যকর *) 0 হিসাবে সংজ্ঞায়িত করা যায় না কারণ শূন্য * থেকে অন্য পয়েন্টারে (গ এর বিপরীতে) কোনও সংক্রামিত রূপান্তর নেই।

-2

(শূন্য *) 0 হ'ল শূন্য, এবং '\ 0' একটি স্ট্রিংয়ের শেষে প্রতিনিধিত্ব করে।

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