C++ 二維數組(雙重指針作為函數參數)


本文的學習內容參考: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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM