【问题标题】:C++ arrays as pointers questionC++ 数组作为指针问题
【发布时间】:2011-05-24 15:36:25
【问题描述】:

为什么会这样:

char buf[10], *pbuf = buf, **ppbuf = &pbuf;

这不是:

char buf[10], **ppbuf = &buf;

据我了解,第二行只是第一行的简写。

【问题讨论】:

    标签: c++ arrays pointers char


    【解决方案1】:

    buf 是一个数组,而不是指针,因此您不能将其地址分配给指针指针。 pbuf 一个指针(指向数组的第一个元素),所以你可以将它的地址分配给一个指针指针。

    这样想代码:

    typedef char* char_p;
    
    char buf[10];
    char_p *ppbuf = &buf;  // If this was legal...
    *ppbuf = NULL;         // what would this mean?
    

    【讨论】:

      【解决方案2】:

      &buf 的类型错误。 &buf 是一个指向 10 个数组的指针 charppbuf 必须使用指向 char 的指针来初始化。

      在第一次初始化中,虽然buf 表示一个数组,但它会衰减为指向其第一个元素的char*,因此初始化是有效的。

      你也不能这样做:char buf[10], **ppbuf = &(&buf[0]); 因为&buf[0] 不是左值所以你不能取它的地址。

      【讨论】:

      • 数组名不是它最火元素的地址吗?还是仅在函数的参数中有效?
      • @dimayak:数组变量在适当的时候隐式转换为其第一个元素的地址(一个 char*)。但它不是指向 char* 的指针。
      • @dimayak:不。数组的名称就是数组的名称。它衰减为指向其在表达式上下文中的第一个元素的指针,而不是作为一元 &sizeof 的参数。
      【解决方案3】:

      它们不相等。

      *pbuf = buf
      

      这意味着,“pbuf 是指向类型char 的指针,其值是buf 的地址。”因为buf 是一个字符数组,所以这行得通。

      **ppbuf = &pbuf
      

      这意味着,“ppbuf 是指向类型char 的指针,其值是pbuf 的地址。”因为pbuf 是一个指向char 类型的指针,所以这是可行的。

      **ppbuf = &buf
      

      这意味着,“ppbuf 是指向类型char 的指针,其值是buf 的地址。”由于buf 是一个字符数组,因此失败。

      【讨论】:

        【解决方案4】:

        从以下开始很容易看出不一样:

        *pbuf = buf
        

        由于pbuf的间接寻址是buf,所以pbuf包含了buf的地址,因此:

        pbuf = &buf
        

        所以:

        **ppbuf != pbuf
        **ppbuf != &buf
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-26
          • 1970-01-01
          • 2018-03-10
          • 1970-01-01
          相关资源
          最近更新 更多