二維陣列做形參

2021-06-18 14:54:09 字數 1537 閱讀 7179

來看《c++ primer》中給出的方法:

[cpp]view plain

copy

void

func1(

intiarray[10])  

intmain()    

編譯通過,注意形參宣告一定要給出第二個維度的大小,要不編譯不過。

[cpp]view plain

copy

void

func2(

int(*parray)[10])  

void

func2_1(

int(*parray)) 

//編譯通過,無法呼叫

intmain()    

其實二維陣列名就是乙個指向一維陣列的指標,所以這種宣告方式ok。必須指定一維陣列的長度,如果沒有指定的話,函式宣告編譯通過。但是如果一旦有呼叫**,就有編譯不通過,因為沒有實參型別能匹配int.

[cpp]view plain

copy

void

func3(

int(&parray)[10][10])  

intmain()    

必須指定兩個維度的長度。

[cpp]view plain

copy

void

func4(

int(*parray)[10][10])  

intmain()    

必須指定兩個維度的長度。

以上方法都可以等價使用,對陣列來說,沒有值傳遞。

還不滿足,還有其他的宣告方式嗎?回到本文開始提到的問題:可以用雙重指標int**作為形參,接受二維陣列實參嗎?答案是肯定的,但是又侷限性。用雙重指標作為形參,那麼相應的實參也要是乙個雙重指標。事實上,這個雙重指標其實指向乙個元素是指標的陣列,雙重指標的宣告方式,很適合傳遞動態建立的二維陣列。怎麼動態建立乙個二維陣列?如下程式:

[cpp]view plain

copy

intmain()    

會發現編譯不通過,第二個維度長度必須為常量。那麼怎麼宣告乙個兩個維度都能動態指定的二維陣列呢?看下面:

[cpp]view plain

copy

void

func5(

int** parray, 

intm, 

intn)  

#include 

intmain()  

func5(parray, m, n);  

}      

這裡為二維陣列申請了一段連續的記憶體,然後給每乙個元素指定定址方式(也可以為每乙個元素分別申請記憶體,就不必指定定址方式了),最後將雙重指標作為實參傳遞給func5。這裡func5多了兩個形參,是二維陣列的維度,也可以不宣告這兩個形參,但是為了安全嘛,還是指定的好。最後編譯,執行,一切ok。總結一下,上面的**其實是實現了引數傳遞動態建立的二維陣列。

二維陣列做形參

可以用二維陣列名作為實參或者形參,在被呼叫函式中對形引數組定義時可以可以指 定所有維數的大小,也可以省略第一維的大 明,如 void func int array 3 10 void func int array 10 二者都是合法而且等價,但是不能把第二維或者更高維的大小省略,如下面的定義是 不合...

二維陣列作為形參

以下是網上摘抄的一段 首先,我引用了譚浩強先生編著的 c程式設計 上面的一節原文,它簡要介紹了如何將二維陣列作為引數傳遞,原文如下 略有改變,請原諒 原文開始 可以用二維陣列名作為實參或者形參,在被呼叫函式中對形引數組定義時可以指定所有維數的大小,也可以省略第一維的大 明,如 void func i...

C語言 二維指標做形參

關鍵 傳入時強制型別轉換 使用時自己手工定址 今天寫程式的時候要用到二維陣列作引數傳給乙個函式,我發現將二維陣列作引數進行傳遞還不是想象得那麼簡單裡,但是最後我也解決了遇到的問題,所以這篇文章主要介紹如何處理二維陣列當作引數傳遞的情況,希望大家不至於再在這上面浪費時間。正文 首先,我引用了譚浩強先生...