C 中陣列引數詳解

2021-06-21 21:44:41 字數 1219 閱讀 1407

在c++中,陣列永遠不會按值傳遞。它是傳遞第乙個元素(準確地說是第0個)的指標。

例如,如下宣告:

void putvalues(int[10]);

被編譯器視為:

void putvalues(int*);

陣列的長度與引數宣告無關。因此,下列三個宣告是等價的:

void putvalues(int*);

void putvalues(int);

void putvalues(int[10]);

因為陣列被傳遞為指標,所以這對程式設計師有兩個含義:

1、在被調函式內對引數陣列的改變將被應用到陣列實參上而不是本地拷貝上。當用作實參的陣列必須保持不變時,程式設計師需要保留陣列的拷貝。函式可以通過把引數型別宣告為const來表明不希望改變陣列元素:

void putvalues(const int[10]);

2、陣列長度不是引數型別的一部分。函式不知道傳遞給它的陣列的實際長度,編譯器也不知道,當編譯器對實參型別進行引數型別檢查時,並不檢查陣列的長度。

例如:

putvalues(

int[

10]); 

//視為int*

intmain()

引數的型別檢查只能保證putvalues()的再次呼叫都提供了int*型的實參。型別檢查不能檢驗實參是乙個10元素的陣列。

習慣上,c風格字串是字元的陣列,它用乙個空字元編碼作為結尾。但是所有其他型別,包括希望處理內含字元的字元陣列,必須以某種方式在向函式傳遞實參時使其知道它的長度。一種常見的機制是提供乙個含有陣列實參的長度的額外引數。例如:

putvalues(

int, 

intsize);

intmain()

另外一種機制是將引數宣告為陣列的引用。當引數是乙個陣列型別的引用時,陣列長度成為引數和型別的一部分,編譯器檢查陣列實參的長度與在函式引數型別中指定的長度是否匹配。

//引數為10個int的陣列

//parameter is a reference to an array of 10 ints

void

putvalues(

int(

&arr)[

10]);

intmain()

因為陣列的長度現在是引數型別的一部分,所以putvalues()的這個版本只接受10個int的陣列。這限制了可以作為實參被傳遞給putvalues()的陣列的種類。但是,它也使函式的實現更加簡單。

C 中陣列引數詳解

在c 中,陣列永遠不會按值傳遞。它是傳遞第乙個元素 準確地說是第0個 的指標。例如,如下宣告 void putvalues int 10 被編譯器視為 void putvalues int 陣列的長度與引數宣告無關。因此,下列三個宣告是等價的 void putvalues int void putv...

C 中引數陣列 引用引數和輸出引數示例詳解

前言 引數陣列 在c 中,可以為函式指定乙個不定長的引數,這個引數是函式定義中的最後乙個引數,這個引數叫做引數陣列。下面是乙個例子 namespace ch6ex2 return sum static void main string args console.readkey 函式sumvals有乙...

C 中動態陣列 陣列引數

一 c 中的動態陣列 寫程式的時候,我在想動態陣列怎麼寫,new int,方括號中可以寫常量嗎,真是鬱悶,一些基本的知識都不記得,還是多練練吧。int pia new int 10 陣列的維數可以是任意的複雜表示式。delete pia 動態分配陣列時,陣列元素為類型別呼叫預設建構函式,內建型別的不...