最近在编程C++是遇到一个warming,内容为:数组地址 == NULL,恒为假
我蛮疑惑的,因为我理解中,一个地址指向NULL是很平常的事情。

C++的中NULL

在C语言与C++中,对于NULL,其实是不同的,

1
2
3
4
5
6
7
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

可以看出来,C语言中,NULL是指向地址0,而在C++中,NULL指向数字0
所以,我们常常在释放指针变量之后,将其赋予NULL,

1
2
3
4
int *a = (int)malloc(sizeof(int));
*a = 5;
free(a);
a = NULL;

其本质就是该指针指向地址0。

C++的数组

C++的数据,本质就是在一个整体内存空间存储一定数据的数据结构;而与之对应的链表,是在随机分散的内存空间存储数据的数据结构。
而其数据名,就是指向该数组的头指针。

1
2
3
4
int a[5] = {0};
if (a == *a[0]) {
cout << "True" << endl;
}

以上代码的最终结果,会输出True
那么作为一个固定内存空间内的数据存储结构,其地址应当是固定的,结果也确实如此。

1
2
int a[5] = {0};
a = NULL;

该代码会提示错误,显示左侧应该为一个变量。
而实际上,数组名所代表的地址,就是一个常量,在初始化之后就不能再变更。

解释原因

因此,当在初始化数组之前,肯定不能使为初始化的数据地址与NULL进行比较
而,当数组被初始化之后,其数组名,数组指针就已经是个不等于0的常量
故此,数组地址 == NULL,恒为假。