C++⼆维数组(双重指针作为函数参数)
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.求连续⼀段格⼦权值和,
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
3.求连续⼀段格⼦的最⼤值。
对于每个2、3操作输出你所求出的结果。
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])
{
case1:
break;
case2:
for (int i = operatorArr[m][1];i <= operatorArr[m][2];i++)
{
sum += weight[i-1];
}
cout << sum << endl;
break;
case3:
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++)
switch函数用法举例
{
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");
return0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。