【问题标题】:Cannot convert int(*)[5] to int*无法将 int(*)[5] 转换为 int*
【发布时间】:2020-08-03 14:36:48
【问题描述】:

当我尝试使用指针访问数组元素时出现此错误,我不明白如何在指针的帮助下访问。

Error: cannot convert ‘int (*)[5]’ to ‘int*’ for argument ‘1’ to ‘void addd(int*, int)

任何关于此事的指导将不胜感激!

#include <iostream>
using namespace std;

    void addd(int *ptr,int length)
    {
       cout<<"The values in the array are: ";
       for(int i = 0; i < length; i++) {
          cout<< *ptr <<" ";
          ptr++;
       }
    }
    
    
    int main() {
       int arr[5] = {1, 2, 3, 4, 5};
       
       addd(&arr,5);
       
       //int *ptr = &arr[0];
       return 0;
    }

【问题讨论】:

  • 呼叫应该是addd(arr,5);addd(&amp;arr[0],5);
  • @IanAbbott - 我将其限制为addd(arr,5),取第一个元素的地址(虽然等效)表明对数组/指针转换的误解。
  • @DavidC.Rankin 我虽然最好让 OP 弄清楚为什么这两者是等价的。
  • 两者都提供了相同的结果,但第一个表示理解,在访问时,数组被转换为指向其第一个元素的指针,而第二个使用 地址 运算符来完成同样的事情。我提到它的唯一原因是,附加'&amp;' 以尝试创建指针的问题通常显示出对两者的缺乏和理解。 :).
  • 我猜使用&amp;arr[0] 的一个优点是,如果或当OP 使用std::arraystd::vector 时,代码现在可以互换。

标签: c++ arrays data-conversion


【解决方案1】:

你的函数接收到一个指向int的指针,所以你应该只传递第一个元素的地址。

你可以这样做:

addd(&arr[0],5);

或者简单地说:

addd(arr,5);

【讨论】:

    【解决方案2】:

    你做错了。 &amp;arr 表示 int (*)[5],但您使用的是 int *ptr。所以,你必须像下面这样使用:

    addd(arr, 5); // this is correct
    // addd(&arr, 5) // this is wrong
    

    这里,arr 被传递为 int *

    【讨论】:

    • 不。 &amp;arrint (*)[5]int** 不同。随着int **p;p+1 前进size (a_pointer) 字节数。与int (*p)[5]; p+1 前进sizeof arr 字节(20 字节)。
    • 别担心——这不是我第一次看到:)
    • int (*)[N]int (*)[] 略有不同,所以我不会省略大小。
    • @HolyBlackCat,感谢您的宝贵意见。我已经编辑了帖子。
    【解决方案3】:

    当你将数组传递给函数时,例如:

    addd(arr,5);
    

    然后数组被隐式转换为指向其第一个元素的指针,int*。您可以将其显式化,而不是依赖于隐式转换:

    addd( &arr[0],5);
       //      ^-  first element
       // ^------  address-of first element
    

    但是,数组不是指针,获取数组的地址会产生指向数组的指针:

    using pointer_to_array = int (*)[5];
    pointer_to_array p = &arr;
    

    【讨论】:

      【解决方案4】:

      数组和指针几乎是相互关联的。默认情况下,数组指向第一个元素的地址,即索引 0 处的元素。因此,使用数组和指针几乎是一回事(不是每次都如此)。因此,您不需要将数组传递为

      addd(&arr,5);
      

      你应该只是这样做

      addd(arr,5);
      

      另外,我会说, 该声明 addd(&amp;arr[0],5); 完成了这项工作,但不是一个好方法。

      【讨论】:

        猜你喜欢
        • 2017-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 2021-12-14
        • 2020-04-23
        • 1970-01-01
        相关资源
        最近更新 更多