NULL指针的特定值

时间:2015-10-03 17:11:35

标签: c pointers nul

我在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;
}

1 个答案:

答案 0 :(得分:1)

NULL是一个值,表示任何类型的指针都无效,void*是一种类型。在C或C ++中,常量0可以分配给任何类型的指针,并将其设置为该类型的空指针。常量NULL可能会在异常系统中声明为0((void*)0)或其他内容。

NULL指针是任何类型的指针,已设置为无效值NULL。您必须自己将其设置为此值;只是留下没有初始化器的指针意味着它可能包含垃圾。 (技术上有一些例外,但总是初始化变量。)

void*是一种可以存储任何其他类型指针的类型(指向函数的指针除外)。它不能被解除引用,并且您不能像数组一样索引它或对它进行指针运算。它通常用作语法糖,让你调用一个函数,例如memset(),它只是将你给它的地址视为要填充的字节数组,或者分配p = malloc(…),而不需要显式强制转换。换句话说,当你只是将一个指针视为一个无类型的内存块,以后会变成某种类型的对象,但你不关心它。

如果要测试不同类型的空指针的位值,我建议在uintptr_t中转换为printf()<inttypes.h>格式说明符。在大多数但不是所有实现中,这些都将为零。