精华内容
下载资源
问答
  • 如何将二维数组作为函数的参数传递  今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理...

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

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

    正文:

      首先,我引用了谭浩强先生编著的《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);

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

    展开全文
  • 二维数组作为函数参数传递时,以下格式正确 char (*word)[50] char word[100][50] 或者 char word[][50] 当二维数组是动态申请的 void func( int **a, int m, int n) { } int main() { ...
    void func(char (*arr)[50], int n)
    {
    }
    
    void func1(char arr[][50], int n)
    {
    }
    void func2(char arr[100][50], int n)
    {
    }
    int main()
    {
        char arr[100][50] = {0};
        int n;
    
        scanf("%d", &n);
    
        func(arr, n);
        func1(arr, n);
    
        return 0;
    }

    二维数组作为函数参数传递时,以下格式正确

    char (*word)[50]
    char word[100][50] 或者 char word[][50]

    当二维数组是动态申请的

    void func(int **a, int m, int n)
    {
    }
    
    int main()
    {
        int **arr; //申请一个 3行2列 的二维数组
        int m = 3, n= 2;
        arr = (int **)malloc(sizeof(int*) * m);
        for(int i = 0; i < m; i++)
            arr[i] = (int *)malloc(sizeof(int) * n);
    
        func(arr, m, n);
    
        for(int i = 0; i < m; m++)
            free(arr[i]);
        free(a);
    
        return 0;
    }
    展开全文
  • 如何将二维数组作为函数的参数传递  今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理...

    原文链接: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;
    }


    展开全文
  • 用二维数组作为参数传递(用二维数组处理矩阵),但是希望接受传递二维数组参数的函数可以处理任意维度的数组(希望矩阵的行数和列数都是不固定的)。 【以下转帖】 ------------------------------------------...
  • ...我定义了这样一个数组,我想把这个数组作为参数传递到一个函数中,并要在函数中能引用该二维数组的元素,我该怎么做?   第一种方式是直接传递二维数组,但是必须标明第二维的值,
  • C语言中将二维数组作为参数传递给函数的方法 二维数组的函数参数传递的问题,以前解决过好几次,总还是忘记,这回总结出来写在这里。   #include /********************************* * 方法1: 第一...
  • 二维数组作为参数传递

    万次阅读 多人点赞 2019-04-14 22:53:42
    void func(int **arr,int n,int m)使用二维指针,在这里传递过去的arr是知道这个指针是一个二维数组 #include using namespace std; void func(int **arr,int n,int m){ for(int i=0;i;++i){ for(int j=0;j;+...
  • 显示传递一个二维数组,但是第二维必须固定。第一维可以不写,可以固定,可以比原数组小,会截断。将实参的数组名强转为int*型,这样传递的就相当于一维数组名,函数形参要进一步传入行列的大小,以手工寻址将实参的...
  • 重新认识并理解一下作为参数数组和指针之间的关系
  • 但马上又发现将二维数组传给函数时必须指定第二维的维数,因为函数传递的是一个指向一个一维数组的指针,这个一维数组中存储有着若干元素的数组,所以函数必须要知道这个指针所指向对象的信息,在这里表现为这个被...
  • int (*pArr)[] = {1,2,3,4};这个是数组指针,
  • 二维数组作为参数传递到函数有三种方式:1:直接传递2:指针传递,将二维数组的第一行传递3:利用二级指针进行传递实参为str,str表示排长,表示一维数组的起始地址,所以形参也必须是一个基类型为指向一维数组的指针...
  • 二维数组参数传递

    2015-12-30 12:11:52
    二维数组参数传递
  • C语言二维数组作为函数参数传递

    万次阅读 多人点赞 2018-06-07 21:43:37
    二维数组作为函数的参数,实参可以直接使用二维数组名,在被调用函数中可以定义形参所有维数的大小,也可以省略以为大小的说明。例如: void find(char a[3][10]); void find (char a[ ][10]); 也可以使用数组...
  • 当把二维数组作为参数传递的时候很多人可能一上来就这样写intfun(int **matrix),这样写是没有区分“指向整型指针的指针”与“指向整型数组的指针”的区别。 这样传参是错的,因为matrix是个二维数组,matrix...
  • 二级指针,二维数组函数参数传递

    千次阅读 2018-05-14 12:05:55
    二维数组作为函数形参时,能作为函数实参的是二维数组,数组指针 当指针数组作为函数形参时,能作为函数实参的是指针数组,二级指针,一级指针的地址 2、实例验证: #include &lt;stdio.h&gt; #...
  • C/C++二维数组参数传递与二维指针

    万次阅读 多人点赞 2015-11-06 23:06:06
    那么二维数组的值该如何传递呢?其实它可以像一维数组那样以数组名作为形参和实参,也可以使用二级指针来进行传递,常用的方式如下: 方法一:通过数组名传递 这种方法第一维宽度可以省略,但必须指定第二维的宽度。
  • 1. 二维数组的存储方式及访问方式 二维数组中元素按行存储,所以利用数组下标对元素进行访问时,需要知道数组的列数。 例如: 定义二维数组 int graph[7][7],当需要访问数组元素graph[3]...2. 二维数组作为函数参数
  • 今天写程序的时候要用到二维数组作参数传给一个函数,我发现将...首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何将二维数组作为参数传递,原文如下(略有改变,请原谅): [原文开始]...
  • 概述:  今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行 传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,...将二维数组作为参数传递,原文如下(略有改变,请原谅):

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,295
精华内容 25,718
关键字:

二维数组作为参数传递