二维数组作为参数传递

//二维数组传参问题示例
#include<iostream>
using namespace std;
//方法1:传递数组,注意第二维必须标明
void fun1(int arr[][3],int iRows)
{
    for(int i=0;i<iRows;i++)
    {
        for(int j=0;j<3;j++)
        {
            cout<<arr[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl;
}
//方法二:一重指针
void fun2(int (*arr)[3],int iRows)
{  

    for(int i=0;i<iRows;i++)
    {
        for(int j=0;j<3;j++)
        {
            cout<<arr[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl;
}
//方法三:指针传递,不管是几维数组都把他看成是指针,
void fun3(int*arr,int iRows,int iCols)
{
    for(int i=0;i<iRows;i++)
    {
        for(int j=0;j<3;j++)
        {
            cout<<*(arr+i*iRows+j)<<" ";
        }
        cout<<endl;
    }
    cout<<endl;
}
int main()
{
    int a[2][3]={{1,2,3},{4,5,6}};
    fun1(a,2);
    cout<<endl;
    fun2(a,2);
    cout<<endl;
    //此处必须进行强制类型转换,因为a是二维数组,而需要传入的是指针
    //所以必须强制转换成指针,如果a是一维数组则不必进行强制类型转换
    //为什么一维数组不用强制转换而二维数组必须转换,此问题还没解决,期待大牛!
    fun3((int*)a,2,3);
    cout<<endl;
}

  

用双重指针int**作为形参,接受二维数组实参吗?答案是肯定的,但是又局限性。用双重指针作为形参,那么相应的实参也要是一个双重指针。事实上,这个双重指针其实指向一个元素是指针的数组,双重指针的声明方式,很适合传递动态创建的二维数组。怎么动态创建一个二维数组?如下程序:

  1. int main()
  2. {
  3. int m = 10;
  4. int n = 10;
  5. int** p = new int[m][n];
  6. }

会发现编译不通过,第二个维度长度必须为常量。那么怎么声明一个两个维度都能动态指定的二维数组呢?看下面:

  1. void func5(int** pArray, int m, int n)
  2. {
  3. }
  4. #include <ctime>
  5. int main()
  6. {
  7. int m = 10;
  8. int n = 10;
  9. int** pArray = new int* [m];
  10. pArray[0] = new int[m * n]; // 分配连续内存
  11. // 用pArray[1][0]无法寻址,还需指定下标寻址方式
  12. for(int i = 1; i < m; i++)
  13. {
  14. pArray[i] = pArray[i-1] + n;
  15. }
  16. func5(pArray, m, n);
  17. }

这里为二维数组申请了一段连续的内存,然后给每一个元素指定寻址方式(也可以为每一个元素分别申请内存,就不必指定寻址方式了),最后将双重指针作为实参传递给func5。这里func5多了两个形参,是二维数组的维度,也可以不声明这两个形参,但是为了安全嘛,还是指定的好。最后编译,运行,一切OK。总结一下,上面的代码其实是实现了参数传递动态创建的二维数组。

时间: 2024-10-23 02:00:57

二维数组作为参数传递的相关文章

二维数组作为参数传递的问题

1.当我们使用二维数组作为参数传递的时候,所传递的二维数组的第二项必须为一个常数,否则编译不能通过,如int a[][3]; 例如: #include<stdio.h> #define N 3 int turn(int a[][N]) //注意此处 { int i,j,temp; temp=0; for(i=0; i<N; i++) { for(j=0; j<N; j++) { if(i<j) { temp =a[i][j]; a[i][j]=a[j][i]; a[j][i]

【转载】二维数组的动态分配和参数传递

本篇随笔为转载,原贴地址:http://www.cnblogs.com/bigshow/archive/2009/01/03/1367661.html. 1. C语言动态分配二维数组 (1)已知第二维 Code-1 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char *) * m); printf("%d\n", sizeof(a));//4,指针 printf("%d\n", sizeof(a[0]

二维数组的传参数的方法

如何将二维数组作为函数的参数传递 今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间. 正文: 首先,我引用了谭浩强先生编著的<C程序设计>上面的一节原文,它简要介绍了如何 将二维数组作为参数传递,原文如下(略有改变,请原谅): [原文开始] 可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的

C语言二维数组作为函数的参数

前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include <cstdio> void print(int *a[3]) { printf("%d\n",a[0][0]); } int main() { int a[2][3] = {1,2,3,4,5,6}; print(a); return 0; } 编译程序时候,在第10行提示错误信息:|

C/C++二维数组

已知在C/C++中当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针. 1.二维数组的概念 在C语言中,二维数组实际上是一种特殊的一维数组,它的每个元素也是一个一维数组.因此,二维数组下标形式正确写法如下:int arrays[i][j]. 2.二维数组作为函数参数(传递数组时必须让编译器知道数组最后一维的大小,例如二维数组是列) 规定:如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数(否则编译器无法获得最小元素的地址,因为编译器不知道列的跨度是多少就无法精确

C语言二维数组字符串的赋值

今天用到了二维数组作为参数传递的程序,通过网上搜索,针对自己遇到的问题做个整理. 1.在被调用函数的形参数组定义可以省略第一维的大小,第二维不可省略,如下: void fun(int a[5][20]); //合法 void fun(int a[][20]); //合法 void fun(int a[5][]); //不合法 void fun(int a[][]); //不合法 将二维数组作为形参时,第一维大小可以省略,第二维不可省略,这是有编译器原理限制的,在内存中按数组排列规则存放(按行存放

关于二维数组传参做形参(转)

二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,它的形参该怎样写?要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型. 正确的是:void Func(int array[3][10]); void Func(int array[][10]);可以省略第一维的大小 错误的是void Func(int array[][].这样的用法只能在初始化时可以用);这样写也是错误:void Func(const int m,const

二维数组简介与使用

前言 本文将探讨一下关于二维数组在内存中的存储和二维数组在参数传递时的使用. 一.二维数组在内存中的存储 如果定义一个这样的二维数组int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};则其在内存中的表示可能下面这样的. 由上图可以看出,在内存中二维数组是按照行主序进行存储的,从内存的角度上看,二维数组本质就是一个一维数组.如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组.而二维数组的名字代表二维数组

C/C++怎样传递二维数组,转载自CSDN

用二维数组作为参数传递(用二维数组处理矩阵),但是希望接受传递二维数组参数的函数可以处理任意维度的数组(希望矩阵的行数和列数都是不固定的). [以下转帖] ---------------------------------------------------------------------------------------------- 但一般传递二维数组的基本规则好像是这样的:可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以可以指定所有维数的大小,也可以省略第一维的大