函式呼叫常規二維陣列和動態二維陣列的差異

2021-07-05 02:53:26 字數 1672 閱讀 6034

部落格的內容分為兩個部分,第一部分解釋了函式呼叫常規二維陣列的格式,主要參照的是《c++ prime plus》中的7.4節。第二部分解釋了動態二維陣列的初始化方法,以及函式呼叫動態二維陣列的格式。

首先,我們來看函式在呼叫常規二維陣列過程中,實參和形參的格式。以乙個二維陣列求和的函式為例。

include int mysum(int arr2dim[4], int rows);//形參的格式

using

namespace

std;

int main(),,};

int sum = mysum(arr2dim,3);//實參的格式

return

0; }

int mysum(int arr2dim[4], int rows)

}return tol;

}

形參的格式較為複雜,因為形參需要指出該引數是乙個指向陣列的指標,該陣列由4個int型別的值組成。還有另外一種形參格式,也能說明形參是乙個指向4個int值組成陣列的指標。

int mysum(int (*arr2dim)[4], int rows);//形參的格式
實參的格式比較簡單,只需要把陣列名當作位址傳遞,由於形參中陣列名已經傳遞了陣列的列數,所以還需要傳遞陣列的行數。

以上就是函式呼叫靜態陣列時,實參和形參的格式。但如果是對於用new分配的動態陣列,實參和形參的格式就會和上面的完全不同。依舊以二維陣列求和為例。鑑於用new開闢二維陣列的記憶體比較複雜,本文便先從這塊講解,粗斜體部分**便是分別使用new和delete開闢和釋放空間。

#include 

int mynewsum(int **arr, int rows, int cols);//形參格式

using

namespace

std;

int main()

//遍歷輸入每乙個元素的值

for (int i = 0;i < rows; i++)

}//函式呼叫

int sum = mynewsum(arr,rows,cols);//實參格式

//delete並結束

for(int i = 0;i < rows;i++)

delete arr;

return0;}

int mynewsum(int **arr, int rows, int cols)

}return tol;

}

int *p =new

int [n];

也就是說,用new開闢的記憶體儲存在指標變數中。

二維陣列的陣列名是乙個二層指標。分為兩步開闢記憶體。第一步開闢指標型別、長度為rows的記憶體空間,把位址值賦給arr。第二步時對於每乙個arr[i],開闢int型別,長度為cols的記憶體空間,把位址值賦給arr[i],arr[i]是個一層指標。永遠要記住,在用new開闢記憶體的同時,使用delete對記憶體進行釋放。釋放也分為兩個步驟,第一步,先釋放每乙個arr[i]位置的記憶體,第二步釋放arr位置的記憶體。

在用new開闢好二維陣列的記憶體空間之後,下面來解釋動態陣列實參和新參的格式。形參則需要表明陣列名是乙個二層指標,由於該指標沒有說明陣列的行數和列數,所以還需要傳遞行數和列數。實參依舊是使用陣列名當作位址。

二維指標和二維陣列

二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...

二維陣列 二維陣列和指標

include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...

二維動態陣列

之前都是寫的小程式,一直用的靜態陣列,也沒出現問題。可是,最近碰到大型程式和工程,這時就要用動態陣列了。因為靜態陣列時儲存在棧中的,而動態陣列儲存在堆中。計算機的棧只有1m大小,而堆可以理論上達到計算機記憶體大小,可見當大型工程資料量非常大時,必須使用動態陣列了。c 的動態陣列的建立和刪除要用到ne...