C++ 二维数组(双重指针作为函数参数)
本文的学习内容参考:http://blog.csdn.net/yunyun1886358/article/details/5659851
http://blog.csdn.net/xudongdong99/article/details/6723163
1.使用二维数组作为形参的例子:
void func(int arr[][])
{ }
int main()
{
int array[][];
func(array); //用二维数组名作为实参,调用函数
}
上面的例子可以编译通过,注意,此处一定要给出第二个维度的大小,否则编译无法通过。
2.使用一维指针作为函数参数的形式如下:
void func1(int (*arr)[])
{ }
int main()
{
int array[][];
func1(array);
}
这种声明方式也是OK的,因为二维数组名就是一个指向一维数组的指针,同样地,这里也必须指明第二维的大小,否则编译无法通过。
3.使用双重指针作为形参的方式:这里的形参指定了二维数组的各维度大小
void func2(int** parr, int m, int n)
{ }
int main()
{
int m = ;
int n = ;
int** pArray = new int* [m];
pArray[] = new int[m * n]; // 分配连续内存
// 用pArray[1][0]无法寻址,还需指定下标寻址方式
for(int i = ; i < m; i++)
{
pArray[i] = pArray[i-] + 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 = ;
int max=;
switch (operatorArr[m][])
{
case :
break;
case :
for (int i = operatorArr[m][];i <= operatorArr[m][];i++)
{ sum += weight[i-];
}
cout << sum << endl;
break;
case : for (int i = operatorArr[m][];i <= operatorArr[m][];i++)
{
max = 0.0;
if (max < weight[i-])
max = weight[i-];
}
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 = ;i < m;i++)
{
oper[i] = new int[];
}
for (int i = ;i < n;i++) //输入格子的权重
{
cin >> weight[i];
}
for (int i = ;i < m;i++) //输入操作数组
{
for (int j = ;j < ;j++)
cin >> oper[i][j];
}
for (int i = ;i < m;i++)
{
OperatorType(weight, n, oper, i);
}
system("pause");
return ;
}
C++ 二维数组(双重指针作为函数参数)的更多相关文章
- C++二维数组(指针)做参数
一.问题描述 使用C++编程过程中经常需要使用到二维数组,然而初级程序员在使用过程中经常会出错使程序崩溃.下面就二维指针的定义,初始化,以及二维指针做参数给出简单介绍. 1.二维数组的定义与初始化 在 ...
- 关于c语言二维数组与指针的个人理解及处理办法。
相信大家在学习C语言时,对一维数组和指针的理解应该是自信的,但是,我在学习过程中,看到网上一些博文,发现即便是参加工作的一些专业编程人员,突然碰到二维数组和指针的问题时,也可能会遇到难以处理的诡异问题 ...
- C指针 指针和数组 二维数组的指针 指针应用
直接到变量名标识的存储单元中读取变量的值--直接寻址 通过其他变量间接找到变量的地址读取变量的值--间接寻址 指针变量存放地址 显示变量的地址 指针变量使用前必须初始化,若不知指向哪,可先指向NULL ...
- C++笔记-数组指针/二维数组转换指针
参考资料: 1. 作者 BensonLaur :https://www.cnblogs.com/BensonLaur/p/6367077.html 2. https://blog.csdn.net/ ...
- C语言 二维数组(指针)动态分配和释放(转)
C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...
- 二维数组和指针(C语言)
二维数组和指针 二维数组和指针1.二维数组和数组元素的地址若有以下定义:int *p, a[3][4]; 1)二维数组a由若干个一维数组组成在C语言中定义的二维数组实际上是一个一维数组,这个一维数组的 ...
- PHP如何判断一个数组是一维数组或者是二维数组?用什么函数?
如题:如何判断一个数组是一维数组或者是二维数组?用什么函数? 判断数量即可 <?php if (count($array) == count($array, 1)) { echo '是一维数组' ...
- C语言教学--二维数组和指针的理解
对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...
- c语言编程-----指向二维数组的指针
c中如何返回一个指向二维数组的指针 #include <stdio.h> #include <stdlib.h> #define COUNT 3 typedef int (*M ...
- C/C++——二维数组与指针、指针数组、数组指针(行指针)、二级指针的用法
本文转载自:https://blog.csdn.net/qq_33573235/article/details/79530792 1. 二维数组和指针 要用指针处理二维数组,首先要解决从存储的角度对二 ...
随机推荐
- 4G通信技术LTE介绍
参考文档在这里 LTE技术 LTE是继GSM/EDGE和UMTS/HSxPA之后的由3GPP推出的移动网络技术最新标准,属于4G. 未来网络需要更高的数据速率,和包路由优化系统.更好的QoA和更廉价的 ...
- tomcat 虚拟目录与显示目录中文件列表
虚拟目录: 该方法推荐使用,比较简单. 在%tomcat%\conf\Catalina\localhost(该目录可能需要手工创建)下新建一个文件abc.xml,注意文件名中的abc就表示虚拟目录的名 ...
- AFNetworking2.x 使用过程中遇到的问题
1.//以下写一下关于AFNetworking2.0的GET数据请求问题,刚開始的时候没有写以下标红的代码,所以导致有一个问题.错误显演示样例如以下: Error: Error Domain=AFNe ...
- 【30】透彻了解inlining 的里里外外
1.inline方法相当于文本替换,不需要承担方法调用的额外开销,同时还有潜在的优势,文本替换后,编译器会进行代码优化.而对于方法调用,编译器没有能力进行代码优化. 2.显而易见,inline方法往往 ...
- 关于android的Activity的四种启动模式
最近做项目遇到一个问题,当触摸屏幕的时候通过intent启动activity,发现会启动多次,而后查阅资料,发现,原来是activity的模式设置问题. Activity的启动模式可以通过Androi ...
- Swift概览
<pre name="code" class="objc">转自:http://letsswift.com/2014/06/swift_overvi ...
- Struts2 中的数据传输
1. 如何将参数从界面传递到Action? 你可以把Struts2中的Action看做是Struts1的Action+ActionForm,即只需在Action中定义相关的属性(要有gette ...
- Linq的小知识(一),大家可以学习一下
linq的简介 lLINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性.已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰 ...
- VMware:虚拟机磁盘空间不足怎么办
前言: 虚拟机里一般我们用的虚拟磁盘,在电脑上是一个或多个文件,随着软件和数据的增多,有时也会提示磁盘空间不足. 那么,虚拟机磁盘空间不足如何处理呢? 一:调整磁盘分区大小; 若只是提示相应磁盘分 ...
- 类 ArrayBlockingQueue<E>(一个由数组支持的有界阻塞队列。)
类型参数: E - 在此 collection 中保持的元素类型 所有已实现的接口: Serializable, Iterable<E>, Collection<E>, Blo ...