C++中的空指针声明混淆

Null pointers declaration confusion in C++

我开始学习C++了。我 运行 对指针,特别是 NULL 指针感到有点困惑。根据我的理解,当您声明一个指针并将其设置为指向一个值时,您可以执行以下操作:

    int var = 10;
    int *ptr;
    ptr = &var;
    *ptr = 20;

这会将 var 的值更改为 20。但是当您设置 NULL 指针时,您将执行以下操作:

int *ptr = NULL;

这是否意味着您将 NULL 值分配给 ptr 指向的任何变量而不是地址,因为 * 运算符?我认为 NULL 指针的值(它的地址)为 0,所以根据我的阅读,它指向任何地方。这样做是否更有意义:

int *ptr;
ptr = NULL // or 0?

将不胜感激通俗易懂的解释,我在编写代码和研究时仍在学习所有术语,因此我很乐意解释您使用的任何编程术语。

通过说 int *ptr = NULL; 你是在说“我正在声明一个名为 ptr 的 int 指针,我想指向位置 0 (NULL)。那是这一切都在说。

现在,如果您尝试读取或写入 ptr,您将得到 未定义的行为,这通常是一个糟糕的地方(比仅仅得到更糟糕一个错误,因为你的程序可能会在其他地方开始出现问题,而你不知道为什么)。但一般来说,NULL 指针用于表示不应该使用且必须初始化的情况。

正如大卫施瓦茨所说,

It will be easier to understand if you use int* ptr instead of int *ptr.

这是因为ptr的类型实际上是int*,一个指向整数的指针。声明类型时,* 表示指针。只有在 *ptr = 20 等表达式中使用指针时,* 才表示 "dereference".

NO. 你看到 * 运算符和 ptr 的任何地方都意味着解除引用,除了第一次。当你这样做时

int *ptr = 0;

* 使 ptr 成为一个整数指针并将其指向空地址,内存中的 "zero-th" 位置

在现代 C++ 中更好的用法是

int *ptr = nullptr;

这意味着您的 ptr 在内存中没有可引用的位置。

nullptr 的类型是 nullptr_t ,它不是整数或任何其他类型。它更安全,而不是依赖于宏 NULL。由于 NULL 如果定义为 0 可以转换为整数,并且在处理函数参数和其他情况时会产生问题。

int *ptr = NULL;

* 不是 * 运算符。 * 字符只是指针声明符语法的一部分。它与 * 运算符无关。

表达式中使用了运算符。上面的 *ptr 是声明中的声明符。声明符不是表达式。该声明符中没有运算符,即使某些字符看起来像 "operators".

由于 C++11 别名模板,您可以用常规模板语法替换奇怪的 T* 语法:

template<typename T> using pointer = T*;

pointer<int> ptr = nullptr;

用最简单的话来说:

int *ptr = NULL; 

意味着有一个名为 ptr 的指针被赋值为 NULL,这意味着现在它没有指向任何地方(不是任何垃圾值或其他任何东西)它的值为 NULL!