本文的學習內容參考:http://blog.csdn.net/yunyun1886358/article/details/5659851
http://blog.csdn.net/xudongdong99/article/details/6723163
1.使用二維數組作為形參的例子:
void func(int arr[][10]) { } int main() { int array[10][10]; func(array); //用二維數組名作為實參,調用函數 }
上面的例子可以編譯通過,注意,此處一定要給出第二個維度的大小,否則編譯無法通過。
2.使用一維指針作為函數參數的形式如下:
void func1(int (*arr)[10]) { } int main() { int array[10][10]; func1(array); }
這種聲明方式也是OK的,因為二維數組名就是一個指向一維數組的指針,同樣地,這里也必須指明第二維的大小,否則編譯無法通過。
3.使用雙重指針作為形參的方式:這里的形參指定了二維數組的各維度大小
void func2(int** parr, int m, int n) { } int main() { int m = 10; int n = 10; int** pArray = new int* [m]; pArray[0] = new int[m * n]; // 分配連續內存 // 用pArray[1][0]無法尋址,還需指定下標尋址方式 for(int i = 1; i < m; i++) { pArray[i] = pArray[i-1] + n; } func2(pArray, m, n); }
4.Demo(來自於賽碼網)
Question:
有n個格子,從左到右放成一排,編號為1-n。
共有m次操作,有3種操作類型:
1.修改一個格子的權值,
2.求連續一段格子權值和,
3.求連續一段格子的最大值。
對於每個2、3操作輸出你所求出的結果。
Input: 輸入第一行兩個整數,n表示格子個數,m表示操作次數,n和m中間用空格隔開; 接下來輸入n行,每行一個整數表示一個格子的權值 接下來輸入m行,每行有三個整數,中間用空格隔開;第一個是選擇的操作類型1-3,第二和第三個整數是操作格子的編號。 |
Input Example: 3 3 7 8 9 2 1 3 3 1 3 2 1 2 |
Output: 若執行1操作則無輸出 若執行2和3操作則輸出一個整數 |
Sample Output: 24 9 15 |
Solution:使用雙重指針作為函數形參的例子,該例子中的實參是動態創建的雙重指針形式,可以直接作為實參進行傳遞,如果實參只是普通的二維數組,則在做為實參的時候需要做相應地類型轉換。
#include<iostream> using namespace std; //操作結果輸出函數 void OperatorType(int weight[],int n,int **operatorArr,int m) { int sum = 0; int max=0; switch (operatorArr[m][0]) { case 1: break; case 2: for (int i = operatorArr[m][1];i <= operatorArr[m][2];i++) { sum += weight[i-1]; } cout << sum << endl; break; case 3: for (int i = operatorArr[m][1];i <= operatorArr[m][2];i++) { max = 0.0; if (max < weight[i-1]) max = weight[i-1]; } cout << max << endl; break; default: break; } } int main() { int n, m; //n表示格子數 m表示操作次數 cin >> n >> m; int *weight = new int[n]; //每個格子的權重 int **oper = new int*[m]; //二維數組存放操作數和格子數的數組 for (int i = 0;i < m;i++) { oper[i] = new int[3]; } for (int i = 0;i < n;i++) //輸入格子的權重 { cin >> weight[i]; } for (int i = 0;i < m;i++) //輸入操作數組 { for (int j = 0;j < 3;j++) cin >> oper[i][j]; } for (int i = 0;i < m;i++) { OperatorType(weight, n, oper, i); } system("pause"); return 0; }