C 陣列在函式中的傳遞與返回

2021-07-11 19:44:47 字數 1708 閱讀 1568

陣列在函式中做形參宣告時可以有兩種形式①陣列②指標,舉例如下:

void sum(int arr,int len)

void sum(int *arr,int len)

當且僅當用於函式頭或函式原型中,int *arr和int arr的含義才是相同的,他們都意味著arr是乙個int指標。然而,陣列表示法(int arr)提醒使用者,arr不僅指向int,還指向int陣列的第乙個元素。

怎樣讓函式返回陣列,這個問題屬於非常初級的問題,但是對於初學不知道的人可能會比較頭疼。c++中函式是不能直接返回乙個陣列的,但是陣列其實就是指標,所以可以讓函式返回指標來實現。比如乙個矩陣相乘的函式,很容易地我們就寫成:

#include using namespace std;

float* multmatrix(float a[4], float b[4])

int main()

; float b[4] = ;

float *m = multmatrix(a, b);

cout << m[0] << " " << m[1] << endl;

cout << m[2] << " " << m[3] << endl;

return 0;

}

但是執行後發現結果是:1.75 1.75

6.51468e-039 3.76489e-039

根本不是想要的結果,此時我們在呼叫的函式內設定斷點進行除錯,

發現計算的結果是正確的,但返回後就變了,而且跟上次的結果不一樣。這是為什麼呢?

因為在函式中定義的陣列m在函式執行完後已經被系統釋放掉了,所以在呼叫函式中得到的結果當然不是計算後的結果。有乙個解決辦法就是動態分配記憶體,在函式中new乙個陣列,這樣就不會被釋放掉了。

#include using namespace std;

float* multmatrix(float a[4], float b[4])

int main()

; float b[4] = ;

float *m = multmatrix(a, b);

cout << m[0] << " " << m[1] << endl;

cout << m[2] << " " << m[3] << endl;

delete m;

return 0;

}

執行結果:

1.75 1.75

0 01.75 1.75

0 0沒有問題,new的空間也delete掉了。

後經過多方請教諮詢,現將程式修改如下:

#include using namespace std;

void multmatrix(float m[4], float a[4], float b[4])

int main()

; float b[4] = ;

float *m = new float[4];

multmatrix(m, a, b);

cout << m[0] << " " << m[1] << endl;

cout << m[2] << " " << m[3] << endl;

delete m;

return 0;

}

C 函式傳遞和返回陣列

c 中您可以通過指定不帶索引的陣列名來傳遞乙個指向陣列的指標。c 傳陣列給乙個函式,陣列型別自動轉換為指標型別,因而傳的實際是位址。如果您想要在函式中傳遞乙個一維陣列作為引數,您必須以下面三種方式來宣告函式形式引數,這三種宣告方式的結果是一樣的,因為每種方式都會告訴編譯器將要接收乙個整型指標。同樣地...

C函式引數傳遞與返回值傳遞

1 引數傳遞 stdcall和 cdecl都是函式呼叫約定關鍵字,先給出這兩者的區別,然後舉例項分析 stdcall 引數由右向左壓入堆疊 堆疊由函式本身清理。cdecl 引數也是由右向左壓入堆疊 但堆疊由呼叫者清理。另外,這兩者在同一名字修飾約定下,編譯過後變數和函式的名字也不一樣,具體見另一博文...

C 中函式傳遞陣列的探索

乙個c函式可以把陣列作為形參,在c 具體表現形式有三種 void func int para void func int para 20 void func int para 這三種形式雖然表現不同,在c 中都看成相同的,等價於void func int para 在傳遞實參時,陣列名被隱式轉換成指...