数组和指针作为参数和返回值

时间:2014-03-11 01:20:14

标签: c++ arrays pointers

#include <iostream>
using namespace std;

int getDegree()
{
    int degree;
    cout << "Enter degree of polynomial" << endl;

    cin >> degree;

    return degree;
}

int* getPoly(int degree)
{
    cout << "Enter coefficients in order of power of x. e.g. for 2 + x + 3x^2, enter 2 then 1     then 3" << endl;

    int coeff [degree +1];
    for (int i = 0; i <= degree; i++)
    {
        cin >> coeff[i];
    }

    return coeff;
}

int* polyder(int p[], int degree)
{
    int dp[degree];

    for(int i = 0; i < degree; i++)
    {
        dp[i] = p[i+1] * (i+1);
    }

    return dp;
}

int main(int argc, const char * argv[])
{
    int degree = getDegree();
    int p = *getPoly(degree);
    int dp = *polyder(&p, degree);

    for(int i = 0; i < degree +1; i++)
        cout << "   " << p[i] << " x^" << i;
    cout << endl;

    for(int i = 0; i < degree +1; i++)
        cout << "   " << dp[i] << " x^" << i;
    cout << endl;

    return 0;
}

我在打印语句中遇到错误。 我并不担心所涉及的数学,只是如何在函数/方法之间传递数组。

任何人都可以找到为什么这不起作用? 我是C ++的新手,习惯于Java。

3 个答案:

答案 0 :(得分:2)

  

有人能找到为什么这不起作用吗?

在C ++变量中,当声明它们的作用域结束时,它们被销毁。返回函数结束时不存在的变量的地址:

int* getPoly(int degree)
{
    int coeff [degree +1];
    // ...
    return coeff;
}

如果您希望在函数结束后变量仍然存在,则必须使用new进行分配:

int* getPoly(int degree)
{
    int *coeff = new int[degree +1];
    // ...
    return coeff;
}

并且,在主函数的末尾(或者您不再需要数组的任何地方),调用delete[]来释放内存:

int *p = getPoly(degree);
delete[] p;

Array名称本质上是指向数组第一个元素的指针(正如您在上面的代码中看到的,我已将p声明为int的指针),所以你通过了他们只需提供他们的名字即可使用其他功能:

int* polyder(int p[], int degree){/*do something here*/}
// <-- some other code
int *p = getPoly(degree);
int* returnedArray = polyder(p,degree);

答案 1 :(得分:0)

首先,行

int coeff [degree +1];

不是有效的C ++语句,除非'degree'是常量,即使某些编译器可能允许它。

即使某些编译器允许,coeff的空间也会从堆栈中分配,并在函数返回后无效。因此,行

return coeff;

返回一个在使用时无效的内存位置。

为了返回有效的记忆功能,请替换

int coeff [degree +1];

通过

int* coeff = new int[degree];

数组中不需要degree+1个项目。

函数polyder中需要进行类似的更改。

答案 2 :(得分:-1)

在C ++中要记住arrays的事情是,与Java不同,它们不是对象(至少在Java中是这样的)。它们只是指向已分配内存块的指针,而[]运算符只是自动进行数学运算以将指针移动到正确的位置。

在函数之间传递数组时,基本上只是传递一个指针。除非你想进入一些非常复杂且可能过多的用例代码,否则你应该总是传递数组的大小以确保索引始终保持在边界内。

正如另一个答案所指出的,你需要确保阵列的生命周期持续只要你需要它。简单地返回一个指向对象的指针不会像在Java中返回引用那样保持活动。

相关问题