[英]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.