簡體   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