【问题标题】:Null pointers declaration confusion in C++C++ 中的空指针声明混淆
【发布时间】:2015-06-25 20:45:11
【问题描述】:

我开始学习 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 = &var 一样。在这种情况下,* 不是运算符,只是类型的一部分。
  • 使用int* ptr而不是int *ptr会更容易理解。
  • @DavidSchwartz 不幸的是,这违反了语言 - int* ptr, a; 变得混乱,a 是指针吗?而int *ptr, a; 很明显不是。
  • int *ptr = NULL; 只是 int *ptr; ptr = NULL; 的简写
  • @Slava 无论哪种方式都令人困惑。这是一个更糟糕的选择。

标签: c++ null-pointer


【解决方案1】:

int *ptr = NULL; 是在说“我正在声明一个名为 ptr 的 int 指针,我想指向位置 0 (NULL)。就是这样。

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

正如大卫·施瓦茨所说,

如果你使用int* ptr而不是int *ptr会更容易理解。

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

【讨论】:

    【解决方案2】:

    借助 C++11 别名模板,您可以将奇怪的 T* 语法替换为常规模板语法:

    template<typename T> using pointer = T*;
    
    pointer<int> ptr = nullptr;
    

    【讨论】:

      【解决方案3】:

      int *ptr = NULL;
      

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

      运算符用于表达式。上面的*ptr 是声明中的声明符。声明符不是表达式。该声明器中没有运算符,即使某些字符看起来像“运算符”。

      【讨论】:

        【解决方案4】:

        不。在任何地方你看到* 运算符和ptr 都意味着取消引用,除了第一次。当你这样做时

        int *ptr = 0;
        

        * 使 ptr 成为整数指针并将其指向空地址,即内存中的“第零”位置

        【讨论】:

          【解决方案5】:

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

          int *ptr = nullptr;
          

          这意味着您的ptr 在内存中没有位置可以尊重。

          nullptr 的类型是 nullptr_t ,它不是整数或任何其他类型。取决于宏NULL,它更安全。因为NULL如果定义为0可以转换成整数,在处理函数参数等场景时会产生问题。

          【讨论】:

          • int* ptr{}; 更好。
          【解决方案6】:

          简单来说:

          int *ptr = NULL; 
          

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

          【讨论】:

            猜你喜欢
            • 2022-01-13
            • 2010-09-25
            • 2011-09-04
            • 2016-11-08
            • 1970-01-01
            • 1970-01-01
            • 2014-11-18
            • 2010-11-24
            • 2020-12-17
            相关资源
            最近更新 更多