如何修改数组指针并将其作为参数传递给需要数组作为参数的函数?

时间:2014-08-19 09:49:04

标签: c++ c arrays function pointers

这可能是一个初学者的问题。比如说,在下面的方法中,我们使用数组alpha和theta,它们作为参数传递给函数 gsl_ran_dirichlet ,函数计算新的theta值并更新相同的数组 theta < / b>。

现在,问题在于我将无法在类中初始化theta,如下面的代码段所示。相反,我将不得不使用指向数组 theta alpha 的指针。我如何将这些数组指针作为参数传递给方法 gsl_ran_dirichlet

我知道不可能将指针作为参数传递给需要数组作为参数的方法。但是实现这一目标的最佳方法是什么(假设我们无法修改 gsl_ran_dirichlet )?

void test (){
    double alpha[2] = { 1, 1};
    double theta[2] = { 1, 1};

    const gsl_rng_type * T;
    gsl_rng * r;

    gsl_rng_env_setup();

    T = gsl_rng_default;
    r = gsl_rng_alloc(T);

    gsl_ran_dirichlet(r, 2, alpha, theta);
    cout << theta[0] << "," << theta[1] << endl;

    gsl_rng_free(r);
}

结果:

0.4,0.6

现在,我还在以下代码中添加了函数和错误,其中数组是动态加载的:

void test() {
    double *alpha, *theta;

    alpha = new double[3];
    theta = new double[3];

    for(int i=0; i<3; ++i){
        alpha = 1;
        theta = 1;
    }

    const gsl_rng_type * T;
    gsl_rng * r;

    gsl_rng_env_setup();

    T = gsl_rng_default;
    r = gsl_rng_alloc(T);

    gsl_ran_dirichlet(r, 3, alpha, theta);
    cout << theta[0] << "," << theta[1] << "," << theta[2] << ":";

    gsl_rng_free(r);
}

错误:

../test.cpp:56:11: error: invalid conversion from ‘int’ to ‘double*’ [-fpermissive]
../test.cpp:57:11: error: invalid conversion from ‘int’ to ‘double*’ [-fpermissive]
make: *** [test.o] Error 1

6 个答案:

答案 0 :(得分:2)

一般:

  • 变量指针:&variable
  • 指向变量的指针:*pointer

具体:

可以以相同的方式使用数组的名称和指向数组的指针,即theta[0]pointer_to_theta[0]是等效的。

int foo[2] = { 1, 2 };

int * pointer_to_foo = foo;

assert( foo[1] == pointer_to_foo[1] );

答案 1 :(得分:2)

你的问题与调用函数无关。

只是你的

for(int i=0; i<3; ++i){
    alpha = 1;
    theta = 1;
}

错了。

alphadouble*,您无法为其分配int(1)。

你要做的是

alpha[i] = 1;

*(alpha + i) = 1

和!请学习阅读错误信息。错误消息中有一个行号,它指向您发生问题的位置。如果你查看第56和57行,你应该能够自己找到它

答案 2 :(得分:1)

尝试将for循环中的分配更改为

alpha[i] = 1;
theta[i] = 1;

答案 3 :(得分:0)

double* alpha;
double* tetha;

void foo()
{
   double (&refToAlpha)[2] = reinterpret_cast<double(&)[2]> (alpha);
   double (&refToTetha)[2] = reinterpret_cast<double(&)[2]> (tetha);
   ...
   gsl_ran_dirichlet(r, 2, refToAlpha, refToTetha);
}

答案 4 :(得分:0)

编译错误很简单:您将int分配给指针指向 - double

for( int i=0; i < 3; ++i ) {
   alpha[i] = i; // dereference before assignment
}

函数的“如何传递数组”有点复杂。遗留和C兼容代码传递指向数组的指针以及它的大小(foo( int* values, size_t size))是很常见的。

如果您有选择的自由,您更愿意使用标准集合(即std::vector<double>)(以及iota等算法):

std::vector<double> alpha, theta;
std::iota(begin(alpha), end(alpha));
std::iota(begin(theta), end(theta));

并通过const引用传递集合 如果您希望函数读取它们,按值,如果您希望函数拥有副本,通过引用如果你想让函数改变参数(即输出参数)。

void gsl_ran_dirichlet(
       std::vector<double> &r, // though I prefer output args to come last
       int i, 
       const std::vector<double> &alpha, 
       const std::vector<double> &theta);

答案 5 :(得分:0)

代码中的问题与将数组传递给函数无关。

在For循环中,尝试将指针(double *)设置为整数(1),这是编译错误的原因。

您必须使用[]来设置数组的位置以设置值。

for(int i=0; i<3; ++i){
    alpha[i] = 1.0;
    theta[i] = 1.0;
}

这与普通指针相同。要设置指针的值,您必须取消引用地址。

int* x = new int();
*x = 5;