空指针如何仍然保留内存地址?

时间:2019-04-21 19:22:45

标签: c++

当您初始化一个没有任何内容的指针(NULL)时,该元素仍然具有足够大的内存地址以用于该指针的初始化类型(4个字节用于int,1个用于char等),但是为什么呢,因为它在技术上什么都没有,甚至不是零值?我的意思是,NULL不能是像0这样的固定值,因为零仍然被认为是一个值,所以它还不止于此? 示例:

#include <iostream>

int *a=NULL;
int main()
{
    std::cout <<&a; //it will show the address in hexadecimal system;
    return 0;
}

2 个答案:

答案 0 :(得分:3)

您的程序无法回答您所提出的问题。该程序显示,是的,指针具有一个地址,它需要一个地址来存储值(它指向的地址)。当您打印该值时,您会看到它确实是nullptr(因为这是C ++而不是C)。

#include <iostream>

int *a= nullptr;
int main()
{
    std::cout << &a << '\n'; // Will show the address OF THE POINTER in hexadecimal system;
    std::cout << a << '\n';  // Will show the address at a is pointing to.
    return 0;
}

输出:

0x601180
0

答案 1 :(得分:0)

我很确定有重复的记录,但是现在看不到。您在不同的上下文中混淆了运算符*&的含义。

在这里,&p表示“ p 的地址”。 p是什么? p是指针类型的 global 变量。接受任何全局变量的地址都是完全有效的。

所以,要清理一下:

#include <iostream>

int *a=NULL;
int main()
{
    std::cout << &a; //perfectly valid, address of p, type int** (pointer-to-pointer-to-int)
    std::cout << a; //still valid, it gives address to where p is pointing, i.e. 0 (NULL)
    std::cout << *a; //wrong, dereferencing an invalid address, there's no memory allocated
    return 0;
}

您似乎对指针也没有多少误解:

  • “该元素的内存地址仍然足够大以用于该指针的初始化类型(int为4个字节,char为1个字节等)”
    一点也不。指针只是一个指针。不管它指向在哪里。实际上,在较低级别上,它只是简单的int。它可以指向一个数组,一个元素,什么也没指向,或者什么都没有存储的荒野。
  • NULL不能是像0这样的固定值,因为零仍然被认为是值,所以它还不止于此?
    同样,指针只是一个指针。指针对价值一无所知。值可能存在或不存在,并且指针指向的内存可能有效或无效。实际上,NULL被定义为正好0(或在新标准中为nullptr):https://en.cppreference.com/w/cpp/types/NULL