C++将数组指针作为函数参数传递

Ort*_*ios 35 c++ arrays pointers function

我正在尝试使用数组指针作为生成数组的函数的参数.

void generateArray(int *a[],  int *si){
  srand(time(0));
  for (int j=0;j<*si;j++)
       *a[j]=(0+rand()%9);
} //end generateArray;

int main() {
  const int size=5;
  int a[size];

  generateArray(&a, &size);

  return 0;
} //end main
Run Code Online (Sandbox Code Playgroud)

但是当我编译它时,会出现以下消息:

cannot convert `int (*)[5]' to `int**' for argument `1' to `void generateArray(int**, int*)'
Run Code Online (Sandbox Code Playgroud)

Pau*_*l R 70

你过度复杂了 - 它只需要:

void generateArray(int *a, int si)
{
    for (int j = 0; j < si; j++)
        a[j] = rand() % 9;
}

int main()
{
    const int size=5;
    int a[size];

    generateArray(a, size);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

将数组作为参数传递给函数时,它会衰减到指向数组第一个元素的指针.因此通常不需要将指针传递给数组.

  • @Ortharios:这是使用指针.因为通过语言设计中的错误,`int a []`,当用作函数参数时,实际上是`int*a`.你会看到Konrad,在dashblinkenlight的答案之下,建议不要使用令人困惑的语法,我全心全意地同意. (11认同)
  • 我知道这使整个代码过于复杂,但这样做的目的是使用指针 (2认同)
  • 如果它让你更快乐,我已经改变了`generateArray`的声明,以便它现在需要一个显式指针.它仍然是相同的功能签名,所以这只是一个美化改变,但希望它现在满足"使用指针"的要求? (2认同)
  • 在我看来,明确地将它声明为指针会使代码的含义变得不那么明确 - 在一种情况下,你肯定知道你正在使用数组,而在另一种情况下,你只是被告知它是你需要的指针记住是一个数组.为了这个目的,我会将答案还给它原来的解决方案. (2认同)

Ben*_*ley 18

int *a[]当用作函数参数(但不在正常声明中)时,是指向指针的指针,而不是指向数组的指针(在正常声明中,它是一个指针数组).指向数组的指针如下所示:

int (*aptr)[N]
Run Code Online (Sandbox Code Playgroud)

哪个N是特定的正整数(不是变量).

如果你把你的函数作为模板,你可以做到,你甚至不需要传递数组的大小(因为它是自动推导出来的):

template<size_t SZ>
void generateArray(int (*aptr)[SZ])
{
    for (size_t i=0; i<SZ; ++i)
        (*aptr)[i] = rand() % 9;
}

int main()
{    
    int a[5];    
    generateArray(&a);
}
Run Code Online (Sandbox Code Playgroud)

您也可以参考:

template<size_t SZ>
void generateArray(int (&arr)[SZ])
{
    for (size_t i=0; i<SZ; ++i)
        arr[i] = rand() % 9;
}

int main()
{    
    int a[5];    
    generateArray(a);
}
Run Code Online (Sandbox Code Playgroud)

  • +1,但请注意,模板解决方案具有在每个阵列大小生成一个函数的负面影响. (6认同)

das*_*ght 6

您不需要使用指向数组的指针以将其传递给数组生成函数,因为当您将数组传递给函数时,数组已经衰减为指针.只需创建参数int a[],并将其用作函数内的常规数组,将对您传入的数组进行更改.

void generateArray(int a[],  int si) {
    srand(time(0));
    for (int j=0;j<*si;j++)
        a[j]=(0+rand()%9);
}

int main(){
    const int size=5;
    int a[size];
    generateArray(a, size);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

作为旁注,您不需要通过指针传递大小,因为您没有在函数内部更改它.此外,将指向常量的指针传递给期望指向非常量的参数并不是一个好主意.

  • 恕我直言,将参数声明为`x []`只是误导.为什么不说清楚它是指针呢? (2认同)