繁体   English   中英

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

[英]Arrays and Pointers as arguments and return values

#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。

谁能找到为什么这行不通?

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

首先,线

int coeff [degree +1];

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

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

return coeff;

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

为了返回有效的内存功能,请替换行

int coeff [degree +1];

通过

int* coeff = new int[degree];

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

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

关于C ++中的arrays ,要记住的一点是,与Java不同,它们不是对象(至少以Java的方式)。 它们只是指向分配的内存块的指针,而[]运算符仅会自动进行数学运算以将指针移至正确的位置。

在函数之间传递数组时,基本上就是在传递指针。 除非您想为用例代码添加一些非常复杂且可能太多的内容,否则应始终将数组的大小与它一起传递,以确保索引始终保持在边界内。

就像其他答案指出的那样,您需要确保数组的生命周期可以持续到您需要的时间。 简单地返回指向对象的指针并不能像在Java中返回引用那样使对象保持活动状态。

暂无
暂无

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

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