זה מכיוון שבשפה יש מה שנקרא null pointer זה ערך יחודי למצביע מסוג מסוים (כן יכול להיות שלסוגים שונים הערך הוא שונה) שמסמל שהמצביע מצביע אל כלום, שאין מצב שהוא יצא שווה לערך של מצביע אחר מאותו סוג. והערך הזה לא חייב להיות 0.
אבל כשאתה כותב משהו בסגנון הבא:
וקומפילר רואה שהצבת 0 בהקשר של מצביע וכבר בזמן קימפול (ורק אז) משנה את הערך לערך ה
null. וככה זה בכל מקרה שבוא הקומפיילר יראה 0 בהקשר של מצביע. ולכן NULL מוגדר כ
הקומפילר רואה 0 בהקשר של מצביע וממיר אותו לערך המיוחד הזה של null.
קצת קוד להמחשה:
קוד:
char *abc, *k = 0, i = 0, p = NULL;
abc = 0; //abc points to null (abc is a null pointer)
abc = NULL; //abc still points to null
abc = k; //abc still points to null
abc = p; //abc could be pointing to null
abc = i; //abc could be pointing to null
ההצבה הראשונה ל abc תציב בו את הערך המיוחד של null (לא חובה שערך זה הוא 0) מכיוון שהקומפילר מזהה 0 בהקשר של מצביע (abc הוא מצביע) והוא יחליף את ה0 בערך המיוחד.
ההצבה השניה גם כן תציב את הערך המיוחד כפי שנאמר קודם. ההצבה השלישית גם כן תציב את הערך המיוחד מכיוון שהמצביע k גם כן מכיל את הערך המיוחד הזה. ההצבה הרביעית אינה בהכרח תעבוד כמו השאר מכיוון שהערך של null יכול להיות גדול יותר מ255 ולכן הוא לא יכנס במלואו ל p. בעצם ההצבה הרביעית תעבוד רק במקרה שבוא הערך המיוחד הזה קטן מ256 ההצבה האחרונה גם אינה בהכרח תעבוד מכיוון שi הוא לא מצביע, יוצב בו בו הערך 0 ולא הערך של null כי זה לא בהקשר של מצביע ואז הערך (אפס) יוצב ב abc ואם במערכת מצביע לכלום (null) מוגדר כערך שונה מאפס ההצבה לא תעבוד כרצוי.
...
ונגיד שאתה מריץ אותה במערכת שבה הnull הוא לא 0 אלא 190,
הפונקציה מחזירה NULL אשר שווה למצביע לכתובת 190, אשר מומר ל char ולכן הפונקציה תחזיר
190, הקומפילר רואה השוואה ל0 אבל בהקשר של char ולכן הוא לא ממיר את ה0 לערך של null
והקוד לא יפעל כמתוכנן. אך אם נשנה את הפונקציה כך שתחזיר מצביע הכל יפעל כראוי כי הקומפילר
יחליף את הערך 0 לערך של null מכיוון שזה בהקשר של מצביע.
קצת ארוך יצא, אז מקווה שהבנת למרות זה.