繁体   English   中英

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

[英]C++ passing an array pointer as a function argument

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

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

但是当我编译此消息时出现:

cannot convert `int (*)[5]' to `int**' for argument `1' to `void generateArray(int**, int*)'

您太复杂了-它只需要:

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;
}

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

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

int (*aptr)[N]

其中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);
}

您还可以参考:

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);
}

您不需要为数组传递指针就可以将其传递给数组生成函数,因为当您将数组传递给函数时,数组已经衰减到了指针 只需将参数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;
}

附带说明一下,您不需要通过指针传递大小,因为您无需在函数内部进行更改。 此外,将常量的指针传递给期望指向非常量的指针的参数不是一个好主意。

我猜这会有所帮助。

当作为函数参数传递时,数组的作用与指针相同。 因此,您无需引用它们。 只需键入: int x[]int x[a] 两种方法都可以。 我猜想,康拉德·鲁道夫(Konrad Rudolf)所说的是一样的话。

This is another method . Passing array as a pointer to the function
void generateArray(int *array,  int size) {
    srand(time(0));
    for (int j=0;j<size;j++)
        array[j]=(0+rand()%9);
}

int main(){
    const int size=5;
    int a[size];
    generateArray(a, size);
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM