精华内容
下载资源
问答
  • C语言二维数组作为函数参数传递

    万次阅读 多人点赞 2018-06-07 21:43:37
    二维数组作为函数参数 二维数组作为函数的参数,实参可以直接使用二维数组名,在被调用函数中可以定义形参所有维数的大小,也可以省略以为大小的说明。例如: void find(char a[3][10]); void find (char a[ ]...

    二维数组存放方式

    二维数组在内存中是按行存放的,先存储第一行,在接着存储第二行…..

    二维数组作为函数参数

    二维数组作为函数的参数,实参可以直接使用二维数组名,在被调用函数中可以定义形参所有维数的大小,也可以省略以为大小的说明。例如:

    void find(char a[3][10]);
    void find (char a[ ][10]);

    也可以使用数组指针来作为函数参数,例如:

    void find (char (*p)[10]);

    但是不能像下面这样使用,例如:

    void find(char a[ ][ ]);
    void find (char a[3][ ]);

    因为从实参传递来的是数组的起始地址,如果在形参中不说明列数,编译器将无法定位元素的的位置。

    各个维数不固定的二维数组

    如果不确定二维数组的维数的话,我们不能使用上面的方法,可以用下面的方法:

    • 手工转变寻址方式

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

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

    p + i*n + j;

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

    void find(char a[3][10]);
    void find (char a[ ][10]);

    转换为

    void find (int **a,int m,int n);

    在转变后的函数中,array[i][j]这样的式子是不对的,因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为: (( int )a+ n*i + j);

    因为上次做了一道c语言的题,题目要求输入8个字符串,必须将字符串按字典序从小到大排列,排列的必须用函数实现,一下是我的代码:

    #include <stdio.h>
    #include <string.h>
    void range(char str[ ][100]);//传进二维数组
    int main(void)
    {
        char str[8][100];
        int i;
        for(i=0;i<8;i++)
            gets(str[i]);
        range(str);
        for(i=0;i<8;i++)
            printf("%s\n",str[i]);
    
    } 
    
    void range(char str[ ][100])
    {
        int i,j;
        char temp[100];
        for(i=0;i<8-1;i++)
        {
            for(j=0;j<8-i-1;j++)
            {
                if(strcmp(str[j],str[j+1])>0)
                {
                    strcpy(temp,str[j]);
                    strcpy(str[j],str[j+1]);
                    strcpy(str[j+1],temp);
                }
            }
        } 
    }
    展开全文
  • #include <iostream>...//二维数组省略一个高维函数 但低维位函数必须定义 void printf1(int a1[][3]){ for(int i=0; i<3; ++i){ for(int j=0; j<3; ++j){ printf("%d\t", a1[i...

    在这里插入图片描述

    #include <iostream>
    #include <Windows.h>
    
    //版本一  省略函数
    //二维数组省略一个高维函数  但低维位函数必须定义
    void printf1(int a1[][3]){
    	for(int i=0; i<3; ++i){
    		for(int j=0; j<3; ++j){
    			printf("%d\t", a1[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    //版本二  指明参数
    void printf2(int a1[3][3]){
    	for(int i=0; i<3; ++i){
    		for(int j=0; j<3; ++j){
    			printf("%d\t", a1[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    //版本三   省略一个高维函数  定义一个参数可以灵活变动
    void printf3(int a1[][3], int number){
    	for(int i=0; i<number; ++i){
    		for(int j=0; j<3; ++j){
    			printf("%d\t", a1[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    //版本四   数组作为函数的参数传递,不是单纯的值传递,传递的是数组本身  
    void printf4(int a1[][3], int number){
    	for(int i=0; i<number; ++i){
    		for(int j=0; j<3; ++j){
    			a1[i][j]=123;
    		}
    		printf("\n");
    	}
    }
    
    int main(void) {
    	int a1[3][3]={0};
    	int i=0;
    	int j=0;
    
    	//给数组赋值
    	for(int i=0; i<3; ++i){
    		for(int j=0; j<3; ++j){
    			a1[i][j]=3*i+j+1;
    		}
    	}
    
    	printf1(a1);
    	printf("\n----------------\n");
    	printf2(a1);
    	printf("\n----------------\n");
    	printf3(a1, 3);
    	printf("\n----------------\n");
    	printf4(a1, 3);
    	printf1(a1);
    	system("pause");
    	return 0;
    }
    //二维数组多维函数参数  
    //给数组赋值
    /**
    	切记!
    	数组作为函数的参数传递,
    	不是单纯的值传递,
    	传递的是数组本身
    	二维数组作为函数的参数:
    **/
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 然而,在将二维数组作为函数参数传递时,参数结构较复杂,难以理解。本文章是实用型文章,注重代码使用,不会讲述过多理论。如果想要学习理论知识(非常推荐,可以对代码的理解更透彻),可以查阅下方参考文献列出...

    前言

    多维数组中,二维数组是最常用的一种。在C语言编程中,二维数组的定义、取值以及赋值都比较容易,与一维数组类似。然而,在将二维数组作为函数参数传递时,参数结构较复杂,难以理解。本文章是实用型文章,注重代码使用,不会讲述过多理论。如果想要学习理论知识(非常推荐,可以对代码的理解更透彻),可以查阅下方参考文献列出书籍的第10章内容。话不多说,下面将给出一个C程序,以展示二维数组作为函数参数的4种方式。注:下面的代码已在VS Code(使用Mingw64)和VS 2015下编译运行过。

    正文

    下面程序的功能是对一个int型二维数组的所有元素进行求和,并分别把求和结果打印在屏幕上。根据二维数组传入函数的方式,定义了4个版本的求和函数。

    #include <stdio.h>
    
    #define ROW 2   //二维数组的行数
    #define COL 2   //二维数组的列数
    
    //4个版本的求和函数
    //方式一:数组形式
    int TwoDimArraySum1(int twoDimAr[][COL], int row, int col);
    
    //方式二:指针形式,prArray是一个指向包含COL个int的数组的指针
    int TwoDimArraySum2(int (*prArray)[COL], int row, int col);
    
    //方式三:指针形式,pr是一个指向int的指针
    int TwoDimArraySum3(int *pr, int row, int col);
    
    //方式四:变长数组(C99开始支持)
    int TwoDimArraySum4(int row, int col, int twoDimAr[row][col]);
    
    int main(void)
    {
        int twoDimArray[ROW][COL] = {{-2, 5}, {4, 9}};
        int result;
    
        //方式一
        result = TwoDimArraySum1(twoDimArray, ROW, COL);
        printf("Sum1函数结果:%d\n", result);
    
        //方式二
        result = TwoDimArraySum2(twoDimArray, ROW, COL);
        printf("Sum2函数结果:%d\n", result);
    
        //方式三
        result = TwoDimArraySum3(twoDimArray[0], ROW, COL);
        printf("Sum3函数结果:%d\n", result);
    
        //方式四
        result = TwoDimArraySum4(ROW, COL, twoDimArray);
        printf("Sum4函数结果:%d\n", result);
    
        return 0;
    }
    
    int TwoDimArraySum1(int twoDimAr[][COL], int row, int col)
    {
        int i, j;
        int result = 0;
    
        for (i = 0; i < row; i++)
        {
            for (j = 0; j < col; j++)
            {
                //下面两种寻址方式都行
                result += twoDimAr[i][j];
                // result += *(*(twoDimAr + i) + j);
            }
        }
        return result;
    }
    
    int TwoDimArraySum2(int (*prArray)[COL], int row, int col)
    {
        int i, j;
        int result = 0;
    
        for (i = 0; i < row; i++)
        {
            for (j = 0; j < col; j++)
            {
                //下面两种寻址方式都行
                result += prArray[i][j];
                // result += *(*(prArray + i) + j);
            }
        }
        return result;
    }
    
    int TwoDimArraySum3(int *pr, int row, int col)
    {
        int i, j;
        int result = 0;
    
        for (i = 0; i < row; i++)
        {
            for (j = 0; j < col; j++)
            {
                //下面两种寻址方式都行
                result += pr[i*col + j];
                // result += *(Pr + i*col + j);
            }
        }
        return result;
    }
    
    int TwoDimArraySum4(int row, int col, int twoDimAr[row][col])
    {
       int i, j;
       int result = 0;
    
       for (int i = 0; i < row; i++)
       {
           for (int j = 0; j < col; j++)
           {
               //下面两种寻址方式都行
               result += twoDimAr[i][j];
               // result += *(*(prArray + i) + j);
           }
       }
       return result;
    }

     正如程序注释所言,方式4(变长数组)是C99开始支持的,不是所有编译器都支持。例如,VS 2015就不支持该语法。因此,在VS 2015环境下运行时,方式4被注释了。下面给出VS Code(基于Mingw64)以及VS 2015环境下的运行结果。

                                                                             左图为VS Code;右图为VS 2015

    优缺点评价

    这里先给出结论,最推荐使用方式3。下面是简要的分析。

    • 方式1和方式2实质上是相同的。它们适用性很好。但是,它们定义必须事先给出第二维的长度,即不是对任意大小的二维数组都适用。
    • 方式3适用性同样很好,对任意大小的二维数组都适用。但是,它是最难理解的。理解它需要对二维数组元素的结构、二维数组元素的储存以及二维数组与指针的关系有比较深刻的理解。
    • 方式4是最容易理解的了。但是,它的适用性最差。

    最后需要强调的是,对于该程序的求和函数,更安全、更易读的写法是将参数列表中接受二维数组数据的参数加上const修饰。本程序没加的原因是为了更好的突出其功能。const修饰的对象不同,产生的效果也不同。如果参数列表中接受二维数组数据的参数加上const修饰,它将无法修改二维数组的数据;如果只有待传入的二维数组是用const修饰,参数列表中的参数不是const修饰的,那么上述方式都不被允许。因此,请根据实际情况,自行决定const的修饰对象和修饰位置。

    关于更高维数组

    对于更高维的数组,上面四种方式仍然适用。除了方式3外,另外三种方式都很容易扩展成更高维的。对于方式3,虽然最推荐它,但是它随着维数的增多,它变得更复杂更难理解。而且基于方式3,还可以延伸出其他方式。这里以三维数组举例,方式3还可以延伸出这样一种方式,该方式中接受三维数组的形参是一个指向一维数组的指针。对于这种由方式3延伸的方式,我是不推荐的,它比方式3更复杂,使用它还不如使用方式3。

    参考文献

    Stephen Prata写的《C Primer Plus》第五版

    博主:虔诚~似锦(主博客)

    个性签名:如果你愿意努力,人生最坏的结果也不过是大器晚成。

    ------------------------------------------------------------------------------------

    如果这篇文章对你帮助的话,记得在下方点赞哦,博主在此感谢!🎉🎉🎉

    如果对这篇文章有疑问,请在评论区指出,欢迎探讨,共同进步。😄😄😄

    展开全文
  • 二维数组作为函数参数调用过程中: void Fun(**a, m, n) { //.... } //.... Fun(a,m,n); 调用函数过程中,会发现VS报错: //IntelliSense: "int (*)[3]" 类型的实参与 "int **" 类型的形参不兼容 这怎么难得倒我...

    二维数组作为函数参数调用过程中:

    void Fun(**a, m, n)
    {
    	//....
    }
    //....
    Fun(a,m,n);
    

    调用函数过程中,会发现VS报错:

    //IntelliSense:  "int (*)[3]" 类型的实参与 "int **" 类型的形参不兼容	
    

    这怎么难得倒我?反手一个Ctrl+C Ctrl + V 百度一下,原来强制类型转换一下就ok!

    Fun((int **)a,m,n);
    

    编译 没有错误! 运行 啪啪打脸。。。

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

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

    二者定义等价,但是不能省略二维数组的第二维,如下面是错误的:

     void Fun(int array[][]); 
    

    这是因为:从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列。
    这也就能解释为什么实参数组维数可以大于形参数组(这时形参数组只取实参数组的一部分,其余部分不起作用 ),例如实参数组定义为:

     void Fun(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;
    

    因此,如果省略了第二维的大小,编译器将不知道如何寻址。
    但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组 作为参数,一个解决办法是:
    不把二维数组当作一个二维数组,而是把它当作一个普通的指针,再另外加上两个参数指明各个维数,然后为二维数组手工寻址,这样就达到了将二维数组作为函数的参数传递的目的,根据这个思想,可以把维数固定 的参数变为维数随即的参数。
    这也就能解释刚刚强制类型转换后运行没有结果的原因了,我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:

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

    至此,二维数组作为函数参数传递的问题就可以解决了。

    展开全文
  • c/c++ 一维数组、二维数组作为函数参数、返回值 一、一维数组作为参数 传入数组 int [] 为了规范,常常需要将数组的size一同传入,这是因为C++/C遇到参数为数组时,不会去一个个拷贝数组内的元素(太过于耗时),...
  • 1. 二维数组的存储方式及访问方式 二维数组中元素按行存储,所以利用数组下标对元素进行访问时,需要知道数组的列数。 例如: 定义二维数组 int graph[7][7],当需要访问数组元素graph[3]...2. 二维数组作为函数参数
  • 在C++中如何将二维数组作为函数参数

    万次阅读 多人点赞 2017-10-12 21:42:58
    一直以来弄不清C++中数组怎么作为参数传入函数中,尤其是最近学了Python之后,Python这种几乎可以把一切作为参数传入函数的方式更是让我在C++中混淆,下面来总结一下二维数组作为函数参数该如何表示。 1、二维数组的...
  • linux C 二维数组 作为函数参数

    千次阅读 2019-01-30 15:43:26
    c语言中怎么用二维数组作为函数参数 可以用二维数组作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如: void Func(int array[3][10]); void Func(int ...
  • /*二维数组作为函数参数必须将列数写入形式参数中, 二维数组作为函数参数的传入方法: 1.int sum_arr(int a[N][N],int size)size的值是行数,二维数组可以看作是 元素为数组的一维数组 example:C++.P207 2....
  • C语言中将二维数组作为函数参数来传递

    万次阅读 多人点赞 2018-03-07 20:17:25
    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下:方法一, 形参给出第二维的长度。例如:#include &lt;stdio.h&gt;void func(int n, char str[ ][5] ){ int i; for(i = 0; i &lt; ...
  • C/C++二维数组作为函数参数传递

    千次阅读 2014-01-04 12:28:20
    在进行程序编写的过程中,时常会遇到将二维数组作为函数参数进行传递操作。在实际操作过程中,可以用二维数组作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小...
  • C语言 | 二维数组作为函数参数

    千次阅读 2018-09-09 11:42:06
    本文更好的排版方式:二维数组作为函数参数 偶然间发现C语言二维数组作为函数的参数是个比较容易出错的问题。例如我写了一个这样子的函数: void func1(int **array, int m, int n) { int i = 0, j = 0; for...
  • 二维数组作为函数参数问题

    千次阅读 2018-06-13 13:52:08
    二维数组作为参数传递给函数,那么在函数参数声明中必须指明数组的列数,因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法...
  • 二维数组作为函数参数的调用

    千次阅读 2017-07-25 10:52:41
    C语言编程的过程中,不可避免的会碰到二维二维以上的数组作为函数的形参的情况,在以前的编程过程中,习惯了动态数组的应用,很是使用直接定义高维数组。最近在编程的过程中就碰到了这个问题:有如下的测试程序: ...
  • C语言二维数组作为函数参数的使用

    万次阅读 2019-01-22 10:17:56
    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度。 #include &lt;stdio.h&gt; void func(int n, char str[][5] ) { int i; for(i = 0; i &lt; n; i++)...
  • 二维数组作为函数参数的传递

    千次阅读 2018-05-13 10:38:41
    自己试着摸索的,会尝试int**做形参,没学过很难知道问题所在 ...首先有以下几种办法传递二维数组地址 void f(int a[10][10])//直接用相同的数组做形参 void f(int a[][10])//可以省略第一维,但第二维不能省 vo...
  • C++二维数组作为函数参数

    千次阅读 2019-07-30 00:07:16
    今天碰到了属于作为参数带入函数的问题 错误示范 #include <iostream> void func(int *a[3]) {} int main() { int a[3][10; func(a); } 首先呢,[]的优先级高于*,所以就成了 *a[3]表示一个一维数组,正确...
  • 按如下函数原型,用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。 其中,n由用户从键盘输入。已知n值不超过10。 void Transpose(int a[][N], int n); void InputMatrix(int a[][N], int n); void ...
  • 题目:给定一幅有N*N矩阵表示的图像,其中每个像素的大小为4字节,编写一个方法,将图像...重点复习数组和指针的有关概念,如果是二维数组,例如int a[m][n],那么a表示的是数组指针,即作为参数传入函数应该是int (*a
  • 编程中,经常需要将一个二维数组作为参数传递给一个函数。当二维数组的行列不确定时,编译会报错。 如果这样定义函数void fun(int matrix[][],int m,int n);则会提示error C2087: '' : missing subscript,因为...
  • 函数调用时通常会进行从数组的数组到数组的指针的隐式变换,并不会为二维数组分配空间,所以不需要二维数组的行数,但是数组的宽度仍然是重要的。 #include #define ROW 3 #define COLLUM 2 //void fun...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 143,009
精华内容 57,203
关键字:

二维数组作为函数参数