关于 NULL NUL '\0' '0' 0 的区别

1. NULL [nʌl]  是一个宏,其定义为空指针,位于stdio.h中。

#ifndef NULL
#define NULL ((void*)0)
#endif

作为一个特殊的指针变量,其不指向任何东西。

实际上NULL的字面值常量为0,然后被强制转换为空指针类型。之所以定义成NULL,本人觉得主要是为了方便识别。比如下面这个例子,它可以提醒我们malloc返回的指针值是否有效。(条件判断可防止对返回的空指针进行解引用)

int *ptr=0;

ptr = malloc( 100 );
if( ptr == NULL ){
  printf( "Out of memory! \n" );
  exit (l);
}

指针变量ptr在定义时可以初始化为0地址,因为对计算机的物理内存来说,0地址是一个特殊的地方,其不能被访问,并且相当敏感,如果对它进行姐引用,会出现segment fault(至少我的机器会这样),如下:

int main(int argc, char **argv)
{
    char *ptr=0;
    printf(": %d\n",*ptr);
    return 0;
}

2. NUL 也是一个宏,为 '\0' 字符的别名(可以读做妞)

#ifndef NUL
#define NUL '\0'
#endif

3. '\0'  是ascii字符集的一个转义字符,因为其在内存单元中的值为0,所以一般用作字符串的结尾,占一个字节。例如:

char arr[3]={'h','i','\0'};
char arr2[3]={'h','i', 0 }; //same as arr
char arr3[3]="hi"; //此处的"hi"是初始化列表,不是字符串常量,记住喔

4. '0' 是ascii字符集的一个打印字符,编码后在内存单元中的值为48

5. 0  字面值常量0,在内存单元中的值为0。其霸占的内存单元个数由类型决定(默认为int型)

参考https://baike.baidu.com/item/%E7%A9%BA%E6%8C%87%E9%92%88%E5%B8%B8%E9%87%8F/9796145

<完>

发布了23 篇原创文章 · 获赞 16 · 访问量 5658

猜你喜欢

转载自blog.csdn.net/xiong3110/article/details/85703590
今日推荐