C 陣列作為函式引數的幾個問題

2021-07-27 23:41:08 字數 1730 閱讀 7728

本文需要解決c++中關於陣列的2個問題:

1. 陣列作為函式引數,傳值還是傳址?

2. 函式引數中的陣列元素個數能否確定?

先看下面的**。

#include 

using

namespace

std;  

void

testarrayarg(

inta)  

intmain()  

;  cout << "in main..."

<< endl;  

cout << "array address: "

<< a << endl;  

cout << "array size: "

<< 

sizeof

(a) << endl;  

cout << "array element count: "

<< 

sizeof

(a) / 

sizeof

(a[0]) << endl;  

testarrayarg(a);  

cout << endl << "the 4th element's value: "

<< a[3] << endl; 

return

0;  

}  執行結果如下:

in main...

array address: 0012ff4c

array size: 20

array element count: 5

in func...

array address: 0012ff4c

array size: 4

array element count: 1

changing the 4th element's value to 10.

the 4th element's value: 10

當我們直接將陣列a作為引數呼叫testarrayarg()時,實參與形參的位址均是0012ff4c。並且,在testarrayarg()中將a[3]的值修改為10後,返回main()函式中,a[3]的值也已經改變。這些都說明c++中陣列作為函式引數是傳址

特別需要注意的是,在main()中,陣列的大小是可以確定的。

array size: 20

array element count: 5

但作為函式引數傳遞後,其大小資訊丟失,只剩下陣列中第乙個元素的資訊。

array size: 4

array element count: 1

這是因為c++實際上是將陣列作為指標來傳遞,而該指標指向陣列的第乙個元素。至於後面陣列在**結束,c++的函式傳遞機制並不負責。

上面的特性可總結為,陣列僅在定義其的域範圍內可確定大小

因此,如果在接受陣列引數的函式中訪問陣列的各個元素,需在定義陣列的域範圍將陣列大小作為另一輔助引數傳遞。則有另一函式定義如下:

[cpp]view plain

copy

void

testarrayarg2(

inta, 

intarraylength)    

可在main()中這樣呼叫:

testarrayarg2(a, sizeof(a) / sizeof(a[0]));

這樣,testarrayarg2()中便可安全地訪問陣列元素了。

C 陣列作為函式引數的幾個問題

本文需要解決c 中關於陣列的2個問題 1.陣列作為函式引數,傳值還是傳址?2.函式引數中的陣列元素個數能否確定?先看下面的 cpp view plain copy include using namespace std void testarrayarg inta intmain cout in m...

C語言陣列作為函式引數

一 陣列元素作為函式的實參 陣列元素就是變數,與普通變數沒有區別,將陣列元素傳送給形參,實現單向的值傳遞。include float max float x,float y int main int m a 0 for int i 1 i 6 i printf 陣列中的最大元素是 d m 二 陣列名...

陣列作為函式引數

一 一維陣列名作函式引數 用陣列名作函式引數,應該在主調函式和被調函式分別定義陣列,例如 void main 在被呼叫函式中宣告了形引數組的大小為10,但在實際中,指定其大小是不起任何作用的,因為c語言編譯對形引數組大小不做檢查,只將實參陣列的首元素位址傳給形引數組。形引數組可以不指定大小,在定義陣...