• 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;
    }
  • 相关阅读:
    ffmpeg常用命令集合
    Django传文件(FILES用法)
    Flask传文件(files用法)
    docker 部署redis服务
    tomcat启动报错ContainerBase.addChild: start
    Echarts折线图 y轴刻度数值与实际值不符解决方法
    春招日记
    Leetcode5700. 使所有区间的异或结果为零(DP)
    VS2015拖动调整代码窗口奔溃
    图床搭建
  • 原文地址:https://www.cnblogs.com/runningRain/p/5940684.html
Copyright © 2020-2023  润新知