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;
}
时间: 2024-11-03 05:34:29

C++ 二维数组(双重指针作为函数参数)的相关文章

C++中用指向二维数组的指针作函数参数

举例说明: 函数声明:void Fun(int (*p)[4] ); void Fun(int (*p)[4] ) {  int i=0,j=0;  for(i=0;i<4;i++)   for(j=0;j<4;j++)      cout << *(*(p+i)+j) << endl;    } p是指向a[0]的指针,那么p+i就是指向a[i]的指针,*(p+i)就是指向a[i][0]的指针, 那么*(p+i)+j就是指向a[i][j]的指针,所以*(*(p+i)+

C++二维数组(指针)做参数

一.问题描述 使用C++编程过程中经常需要使用到二维数组,然而初级程序员在使用过程中经常会出错使程序崩溃.下面就二维指针的定义,初始化,以及二维指针做参数给出简单介绍. 1.二维数组的定义与初始化 在实际使用数组的时候往往开始不知道二维数组的行数和列数,因此程序需要根据用户输入动态定义二维数组的行和列.这里通过C++二级指针来实现,引入变量 int rowNum 行 数, int coluNum 列数, char **p 二维字符数组,这里假定二维字符数组中的字符只能为'0'和'1'. int

C语言 二维数组与指针笔记

今天分析了C语言二维数组和指针的基本理解,感觉有点懵...代码记录一下,如果有大神临幸发现哪里有误,欢迎指正~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> //void func(int p[][]) //这样写等同于void func(int **p) p++移动了四个字节,(*p)++移动了四个字节,不符合二维数组规律 //{ //} //列优先输出的函数(即竖着输出) void func

C语言 二维数组(指针)动态分配和释放(转)

C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按照16位.32位.64位为单位进行编辑的话:旧的16位处理器,比如Intel 80286 CPU需要8个指令,32位的处理器需要4个指令,而64位处理器则只要两个指令,显然,在工作频率相同的情况下,64位处理器的处理速度会比16位.32位的更快.而且除了运算能力之外,与32位处理器相比,64位处理器

程序猿之--C语言细节13(二维数组和指针,&amp;*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)

主要内容:二维数组和指针,&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

直观理解C语言中指向一位数组与二维数组的指针

一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我

例看二维数组,指针,二维数组指针

例程: /****************************************************** * * 文件名:例程 * * 文件描述:例看二维数组,指针,二维数组指针 * * 创建人:Jesse * * 版本号: * * 修改记录: * ******************************************************/ #include <stdio.h> #define ROW 3 #define LINE 3 void main(voi

程序员之--C语言细节13(二维数组和指针,&amp;amp;*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)

主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

PHP如何判断一个数组是一维数组或者是二维数组?用什么函数?

如题:如何判断一个数组是一维数组或者是二维数组?用什么函数? 判断数量即可 <?php if (count($array) == count($array, 1)) { echo '是一维数组'; } else { echo '不是一维数组'; } PHP手册: int count ( mixed $var [, int $mode ] )  --  计算数组中的单元数目或对象中的属性个数  如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1),count() 将递归地对数组

二维数组及指针

首先,看一维数组. []符号是下标运算符,a[i]就是*(a+i) 那么a[i][j] 就是*(a[i]+j)=*(*(a+i)+j) 本人对二级和多级指针的理解:1.抽象上说二级指针的内容是地址的地址.变量A好像跟你捉迷藏似的,你要想找到A,你先得去一个地方把A的地址给找出来,然后再根据这个地址找到A.就类似武侠电影里的宝藏,你要先去一个人的背上发现藏宝图,然后再根据藏宝图里画的地址找到宝藏,在这里,这个人的背就是一个最外层的地址,藏宝图就是内层的地址.2.对于二级指针和多级指针,定义时,我们