精华内容
下载资源
问答
  • 面试时曾经被问到一个问题,就是关于C语言中二维数组作为参数的问题。 C语言中形如a[x][y]的二维数组是按行来存储数据的,意思就是说C语言会根据第二个长度y来截断数据,然后才能检索。因此,当将二维数组作为函数...

    面试时曾经被问到一个问题,就是关于C语言中二维数组作为参数的问题。

    C语言中形如a[x][y]的二维数组是按行来存储数据的,意思就是说C语言会根据第二个长度y来截断数据,然后才能检索。因此,当将二维数组作为函数参数的时候,必须给出y的值,否则不能截断,编译会出错。若想将已有二维数组作为函数参数,可以将二维数组进行强制转换,然后根据*(a + i*y+j)的方式访问元素。示例程序如下(注意标红部分):

    #include <iostream>
    using namespace std;
    
    void InitMatrix(int*a, int x, int y)
    {
    	int i, j;
    	for (i = 0; i < x; i++)
    		for (j = 0; j < y; j++)
    			*(a + i*y+j) = i+j;
    };
    
    
    int main()
    {
    	int a[3][5] = { 0 };
    	InitMatrix((int*)a, 3, 5);
    	cout << a[2][3] << endl;
    	system("pause");
    	return 0;
    }

     

    以下附上参考链接:

    关于c语言中二维数组做参数

    c语言中函数二维数组传递方法小结

     

    展开全文
  • 如何将二维数组作为函数的参数传递  今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的...将二维数组作为参数传递,原文如下

    如何将二维数组作为函数的参数传递

      今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。

    正文:

      首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何

    将二维数组作为参数传递,原文如下(略有改变,请原谅):

      [原文开始]

        可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:

        void Func(int array[3][10]);

        void Func(int array[][10]);

        二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:

        void Func(int array[][]);

        因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能只指定一维而不指定第二维,下面写法是错误的:

        void Func(int array[3][]);实参数组维数可以大于形参数组,例如实参数组定义为:

        void Func(int array[3][10]);

        而形参数组定义为:

        int array[5][10];

        这时形参数组只取实参数组的一部分,其余部分不起作用。

      [原文结束]

      大家可以看到,将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。大家在学编译原理这么课程的时候知道编译器是这样处理数组的:

      对于数组 int p[m][n];

      如果要取p[i][j]的值(i>=0 && i<m && 0<=j && j < n),编译器是这样寻址的,它的地址为:

      p + i*n + j;

      从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确的寻址。但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组作为参数,这就难办了,编译器不能识别阿,怎么办呢?不要着急,编译器虽然不能识别,但是我们完全可以不把它当作一个二维数组,而是把它当作一个普通的指针,再另外加上两个参数指明各个维数,然后我们为二维数组手工寻址,这样就达到了将二维数组作为函数的参数传递的目的,根据这个思想,我们可以把维数固定的参数变为维数随即的参数,例如:

        void Func(int array[3][10]);

        void Func(int array[][10]);

      变为:

        void Func(int **array, int m, int n);

      在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:

        *((int*)array + n*i + j);

        在调用这样的函数的时候,需要注意一下,如下面的例子:

        int a[3][3] =

        {

          {1, 1, 1},

          {2, 2, 2},

          {3, 3, 3}

        };

        Func(a, 3, 3);

      根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换如下调用: 

        Func((int**)a, 3, 3);

      其实多维数组和二维数组原理是一样的,大家可以自己扩充的多维数组,这里不再赘述。写到这里,我先向看了这篇文章后悔的人道歉,浪费你的时间了。下面是一个完整的例子程序,这个例子程序的主要功能是求一个图中某个顶点到其他顶点的最短路经,图是以邻接矩阵的形式存放的(也就是一个二维数组),其实这个函数也是挺有用的,但是我们这篇文章的重点在于将二维数组作为函数的参数传递。

    展开全文
  • 如何将二维数组作为函数的参数传递  今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题...将二维数组作为参数传递,原文如下

    原文链接:http://www.cnblogs.com/denflyson/archive/2013/06/03/3115658.html

    如何将二维数组作为函数的参数传递

      今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。

    正文:

     

      首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何

    将二维数组作为参数传递,原文如下(略有改变,请原谅):

     

      [原文开始]

        可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:

        void Func(int array[3][10]);

        void Func(int array[][10]);

        二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:

        void Func(int array[][]);

        因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能只指定一维而不指定第二维,下面写法是错误的:

        void Func(int array[3][]);实参数组维数可以大于形参数组,例如实参数组定义为:

        void Func(int array[3][10]);

        而形参数组定义为:

        int array[5][10];

        这时形参数组只取实参数组的一部分,其余部分不起作用。

      [原文结束]

      大家可以看到,将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。大家在学编译原理这么课程的时候知道编译器是这样处理数组的:

      对于数组 int p[m][n];

      如果要取p[i][j]的值(i>=0 && i<m && 0<=j && j < n),编译器是这样寻址的,它的地址为:

      p + i*n + j;

      从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确的寻址。但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组作为参数,这就难办了,编译器不能识别阿,怎么办呢?不要着急,编译器虽然不能识别,但是我们完全可以不把它当作一个二维数组,而是把它当作一个普通的指针,再另外加上两个参数指明各个维数,然后我们为二维数组手工寻址,这样就达到了将二维数组作为函数的参数传递的目的,根据这个思想,我们可以把维数固定的参数变为维数随即的参数,例如:

     

        void Func(int array[3][10]);

        void Func(int array[][10]);

      变为:

        void Func(int **array, int m, int n);

     

      在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:

        *((int*)array + n*i + j);

        在调用这样的函数的时候,需要注意一下,如下面的例子:

        int a[3][3] =

        {

          {1, 1, 1},

          {2, 2, 2},

          {3, 3, 3}

        };

        Func(a, 3, 3);

     

      根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换如下调用: 

        Func((int**)a, 3, 3);

      其实多维数组和二维数组原理是一样的,大家可以自己扩充的多维数组,这里不再赘述。写到这里,我先向看了这篇文章后悔的人道歉,浪费你的时间了。下面是一个完整的例子程序,这个例子程序的主要功能是求一个图中某个顶点到其他顶点的最短路经,图是以邻接矩阵的形式存放的(也就是一个二维数组),其实这个函数也是挺有用的,但是我们这篇文章的重点在于将二维数组作为函数的参数传递。

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

    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]=temp;
                }
            }
        }
    }
    
    int main()
    {
        int a[3][3]= {{12,2,8},{22,16,4}, {10,6,14}};
        int i,j;
        turn(a);
        for(i=0; i<3; i++)
        {
            for(j=0; j<3; j++)
            {
                printf("%4d",a[i][j]);
            }
            printf("\n");
        }
        return 0;
    }

    2、一维数组指针作为形参传递,如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]=temp;
                }
            }
        }
    }
    
    int main()
    {
        int a[3][3]= {{12,2,8},{22,16,4}, {10,6,14}};
        int i,j;
        turn(a);
        for(i=0; i<3; i++)
        {
            for(j=0; j<3; j++)
            {
                printf("%4d",a[i][j]);
            }
            printf("\n");
        }
        return 0;
    }


    展开全文
  • 当把二维数组作为参数传递的时候很多人可能一上来就这样写intfun(int **matrix),这样写是没有区分“指向整型指针的指针”与“指向整型数组的指针”的区别。 这样传参是错的,因为matrix是个二维数组,matrix...
  • 二维数组作为参数,传入函数(最好用的) 很多时候我都是直接通过传入一个 固定的数字来传递一个二维数组, 比如这样子定义函数 int fun(int a[][3],int n) 调用函数是 fun(a,n); 这样子调用的二维数组只能是固定...
  • 二维数组作为参数传递(用二维数组处理矩阵),但是希望接受传递二维数组参数的函数可以处理任意维度的数组(希望矩阵的行数和列数都是不固定的)。 【以下转帖】 ------------------------------------------...
  • ...我定义了这样一个数组,我想把这个数组作为参数,传递到一个函数中,并要在函数中能引用该二维数组的元素,我该怎么做?   第一种方式是直接传递二维数组,但是必须标明第二维的值,
  • C语言中将二维数组作为参数传递给函数的方法 二维数组的函数参数传递的问题,以前解决过好几次,总还是忘记,这回总结出来写在这里。   #include /********************************* * 方法1: 第一...
  • 1、可以同时指定第一维和第二...原因:一维数组存放在一段连续的内存中,二维数组的维度是逻辑上的概念,而实际上,二维数组在内存中也是一段连续的空间,与一维数组相同。 转载于:https://www.cnblogs.com/zksh20...
  • 回答: 在C语言中,有很多方法可以将2d数组作为参数传递。在下面的部分中,我描述了将2d数组作为参数传递给函数...如果int aiData [3] [3]是一个整数的二维数组,它将被拆分成一个指向3个整数数组的指针(int(*)[...
  • 显示传递一个二维数组,但是第二维必须固定。第一维可以不写,可以固定,可以比原数组小,会截断。将实参的数组名强转为int*型,这样传递的就相当于一维数组名,函数形参要进一步传入行列的大小,以手工寻址将实参的...
  • 二维数组作为参数传递

    万次阅读 多人点赞 2019-04-14 22:53:42
    func(int (*arr)[10],int n)效果同第二种方案,在这里我们也可以看出二维数组实际上是一个指针数组,也就是arr就是一个存储着指针的数组 #include using namespace std; void func(int (*arr)[10],int n){ for...
  • 二维数组作为参数传递时,一般都会用以下的这两种方式: #include void average(float *p,int n); void search(float (*p)[4],int n); int main() { float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,...
  • 二维数组作为参数的函数的定义及调用方法 Geophoenix C语言编程的过程中,不可避免的会碰到二维或二维以上的数组作为函数的形参的情况,在以前的编程过程中,习惯了动态数组的应用,很是使用直接定义高维数组。...
  • 二维数组作为函数参数传递时,以下格式正确 char (*word)[50] char word[100][50] 或者 char word[][50] 当二维数组是动态申请的 void func( int **a, int m, int n) { } int main() { ...
  • c++ 二维数组作为参数传入的问题

    千次阅读 2018-05-03 22:47:02
    如何写一个二维动态数组,并作为参数传入,以及输出这个动态数组。 #include &lt;iostream&gt;#include &lt;malloc.h&gt;using namespace std;class che{ private: int **a;//动态数组a int c,r;/...
  • C++二维数组作为参数问题

    千次阅读 2015-12-01 16:06:09
    使用C++写程序也写了这么长时间了,发现距离掌握这门语言依然非常遥远,经常被一些细节问题问倒,前几天被一大牛问到c++里面怎么向一个函数传递二维数组,脑子中的第一反应是:f(int a[][])(因为比较早这前做过很短...
  • c++ 二维数组作为参数引用

    千次阅读 2018-05-12 09:35:17
    //参数只写上第二维大小 void getAllcameraList(float(*left_Intrinsic)[3], float(*left_Rotation)[3], float(*left_Translation)[3], float(*right_Intrinsic)[3], float(*right_Rotation)[3], float(*right_...
  • 首先,void f(a[ ][ ]);是不正确的定义 二维数据作为函数参数时,要明确指明二维数组的列数,...另外,也不能用非常量定义二维数组作为其下标。 void f ( a[m][n]);是严重错误的; 正确的应用模式一 void func...
  • 以上两个原型的含义完全一样,只不过第个比第一个可读性强。 函数定义如下: int sum(int arr[][4], int size) { int total = 0; for(int r = 0; r ; r++) for(int c = 0; c ; c++) total += arr...
  • 重新认识并理解一下作为参数数组和指针之间的关系

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,518
精华内容 40,207
关键字:

二维数组作为参数