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