【问题标题】:standard conversions: Array-to-pointer conversion标准转换:数组到指针的转换
【发布时间】:2010-11-19 09:25:22
【问题描述】:

这是来自 ISO 的要点:标准转换:数组到指针的转换:$4.2.1

“数组”类型的左值或右值 N T”或“未知边界的数组 T”可以转换为右值 类型为“指向 T 的指针”。结果是 指向第一个元素的指针 数组。

如果可能的话,谁能用示例程序解释一下。

我已经看过这些链接,但我无法理解:

Array and Rvalue

I think I may have come up with an example of rvalue of array type

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    在 C 和 C++ 中,可以将数组用作指向其第一个元素的指针。实际上,给定一个名为 x 的数组,您可以将大部分使用的 &x[0] 替换为 x

    这就是数组对象如何使用下标:

    int x[5];
    x[2];     // this is the same as (&x[0])[2]
    

    这也是将数组传递给具有指针类型参数的函数的方式:

    void f(int* p);
    
    int x[5];
    f(x);     // this is the same as f(&x[0])
    

    有几种情况不会发生数组到指针的转换。示例包括当数组是sizeof 或一元-&(地址运算符)的操作数时,当字符串字面量用于初始化数组时,以及当数组绑定到对数组的引用时.

    【讨论】:

    • x[2] 等同于 *(&x[0] + 2);您的意思是 x + 2 与 &x[0] + 2 相同吗?根据 &x[0](也是下标)定义下标存在问题。
    • 另一个这样的上下文是当数组绑定到数组的引用时。干杯,
    • @Fred:呃,那真的很糟糕;感谢您指出。我实际上是指(&x[0])[2],因为我试图证明x&x[0] 之间的等价性。不过,您的示例也可以。
    • @Alf:感谢您提醒我有关数组引用的问题。还有一种情况是使用字符串文字(它是一个数组)作为初始值设定项。我们是否遗漏了任何其他案例,还是所有这些案例?
    【解决方案2】:
    int a[6];
    int *b = a;
    

    指针b指向a[0],即包含元素a[0]的地址。

    【讨论】:

      【解决方案3】:

      这意味着,您可能会遇到以下情况:

      int arr[100];
      arr[ 0 ] = arr[ 1 ] = 666;
      // ..
      

      你可以使用arr作为指向int的指针,它指向数组的第一个元素,例如:

      *arr = 123;
      

      然后数组将是:arr = { 123, 666, ... }

      另外,您可以将数组传递给一个函数,该函数采用 int*:

      void f( int* a ) { /* ... */ }
      

      然后调用它:

      f( arr );
      

      和这样称呼完全一样:

      f( &arr[ 0 ] );
      

      这就是The result is a pointer to the first element of the array. 的意思。


      另一种方式,你可以使用第一个元素的地址是:

      *( &arr[ 0 ] + 1 ) = 222;
      

      这将使数组中的第二个元素的值为222;是一样的

      arr[1] = 222;
      

      *( arr + 1 ) = 222;
      

      【讨论】:

      • 好的,同意,已编辑。删除了带有“数组名称”的部分,我的错。
      【解决方案4】:

      其中一个例子是,任何数组变量在传递给一个接受数组类型指针的函数时,都会自动退化为指向其第一个元素的指针。

      Arrays and Pointers 上查看 C-Faq 中的此部分。这同样适用于 C++。

      void foo(int *a) {
          a[0] = 1;
      }
      
      int main(void) {
          int b[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
      
          foo(b);
      
          printf("b[0] == %d\n", b[0]);
      }
      

      【讨论】:

        猜你喜欢
        • 2016-03-30
        • 1970-01-01
        • 2013-05-17
        • 2014-02-09
        • 1970-01-01
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多