我在What's the difference between a null pointer and a void pointer?中指的是NULL指针 根据@AnT的帖子回复,"形式上,每个特定的指针类型(int *,char *等)都有自己专用的空指针值"
我写了简单的程序。但指针值对于整数或字符不固定。它有时会改变。那么我们如何得出结论,指向int的NULL指针具有固定值?指针的值也永远不会为0。
#include <stdio.h>
int main()
{
int a;
char *ptr; // Declaring a pointer without initializing it
int *ptrToInt;
if(ptr)
{
printf("Pointer is not NULL\n");
printf("Value of pointer = %x\n",ptr);
printf("Value of pointer = %x\n",ptrToInt);
}
else
{
printf("Pointer is NULL\n");
printf("Value of pointer = %x",ptr);
printf("Value of pointer = %x\n",ptrToInt);
}
return 0;
}
答案 0 :(得分:1)
NULL
是一个值,表示任何类型的指针都无效,void*
是一种类型。在C或C ++中,常量0可以分配给任何类型的指针,并将其设置为该类型的空指针。常量NULL
可能会在异常系统中声明为0
,((void*)0)
或其他内容。
NULL
指针是任何类型的指针,已设置为无效值NULL
。您必须自己将其设置为此值;只是留下没有初始化器的指针意味着它可能包含垃圾。 (技术上有一些例外,但总是初始化变量。)
void*
是一种可以存储任何其他类型指针的类型(指向函数的指针除外)。它不能被解除引用,并且您不能像数组一样索引它或对它进行指针运算。它通常用作语法糖,让你调用一个函数,例如memset()
,它只是将你给它的地址视为要填充的字节数组,或者分配p = malloc(…)
,而不需要显式强制转换。换句话说,当你只是将一个指针视为一个无类型的内存块,以后会变成某种类型的对象,但你不关心它。
如果要测试不同类型的空指针的位值,我建议在uintptr_t
中转换为printf()
和<inttypes.h>
格式说明符。在大多数但不是所有实现中,这些都将为零。