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

二维数组在内存中使按数组的排列规则存储(按行存放),因此在函数原型中的二维数组的形参必须给定列的大小

对于如下数组

int main()
{
	int a[3][2] = {1,2,3,4,5,6};
	print1(a);
	return 0;
}

错误范例:

void print1(int **b)
void print1(int b[3][])

没有给定列的大小,编译器不能确定数据的存储顺序(有多少行多少列),因此无法读取到指定行列的数据

实际上函数调用时传入的实参是int (*)[2], 因此不能匹配int**的形参

正确范例:

1.引用(C++特有):

void print1(int (&b)[3][2])

2.指定行和列

void print2(int b[3][2])

3. 指定列

void print3(int b[][2])

将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,

这是由编译器原理限制的.

#include <stdio.h>
#include <stdlib.h>
void print1(int (&b)[3][2], int row, int col)
{
	printf("Run print1\n");
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			printf("%d\n", b[i][j]);
}
void print2(int b[3][2], int row, int col)
{
	printf("\nRun print2\n");
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			printf("%d\n", b[i][j]);
}
void print3(int b[][2], int row, int col)
{
	printf("\nRun print3\n");
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			printf("%d\n", b[i][j]);
}

int main()
{
	int a[3][2] = {1,2,3,4,5,6};
	print1(a, 3, 2);
	print2(a, 3, 2);
	print3(a, 3, 2);
	system("pause");
	return 0;
}

参考资料:http://bbs.csdn.net/topics/60157289

时间: 2024-10-25 19:52:20

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

二维数组指针作为函数参数传递

以前二维数组作为函数参数传递我都是这么写的void def(int a[][10]).传递一个二维数组a,(其中第二维要确定大小)其实想一想挺合理的... 后来,发现还有这种写法 void def(int(*a)[10]): /* *********************************************** Author :guanjun Created Time :2017/3/18 13:32:52 File Name :33.cpp *******************

二维数组与方法(函数)

二维数组 什么是二维? ? 比如(合金弹头.超级玛丽) ? 二维数组里面放一维数组. 什么是二维数组? ? 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”, ? 二维数组又称为矩阵,行列数相等的矩阵称为方阵 怎么创建一个二维数组? 数据类型[][] 对象名 = new 数据类型[x][y]; x代表行 y代表列 例如:  int [ ][ ] a = new int [2] [2]; 数组 : 使用索引来操作元素, 下面给二维数组赋值 a[0] [0] = 1; //第一行第一列 a

二维数组如何作为函数参数使用?(转)

如果我们需要编写一个处理二维数组的函数,那么这个函数原型应该如何声明呢? 首先,我们应该牢记:数组名被视为其地址,因此,相应的形参是一个指针.例如,假设有如下的代码: [cpp] view plaincopy int data[3][4] = { {1, 2, 3, 4}, {5, 5, 7, 8}, {9, 10, 11, 12} } int total = sum(data, 3); 那么sun函数的原型应该如何声明呢?为什么将行数3作为参数,而不将列数4作为参数呢? 我们可以这样理解:da

定义一个二维数组反置函数

#include<stdio.h> //定义一个3*3数组反转函数 void fan(int a[3][3]){ int i,j; int t[3][3]; for(i=0;i<3;i++) for(j=0;j<3;j++) t[i][j]=a[j][i]; for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%d ",t[i][j]); printf("\n"); } return 0; } /

二维数组作为函数参数传递剖析

前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} //以下两种可以忽略行数 f(int daytab[][13]) {...} f(int (*daytab)[13]) {...} 甚至会有人告诉你多维数组作为参数传递可以省略第一维,其他维不能省略.然而你对这种形式并不满意:如果事先限定了二维数组的大小,函数的泛用性就要大打折扣了.因为你真正需要的,

参数传递二维数组

转自http://blog.csdn.net/yunyun1886358/article/details/5659851 数组名作为形参 1 void func1(int iArray[][10]) 2 { 3 4 } 5 6 7 8 int main() 9 { 10 int array[10][10]; 11 func1(array); 12 13 } 编译通过,注意形参声明一定要给出第二个维度的大小,要不编译不过. 一维数组指针作为形参 1 void func2(int (*pArray)

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

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

C语言 memcpy二维数组的复制

今天在实现二维数组的复制功能时,竟然出现了好多问题,还是太不小心了. 我们知道,平时进行矩阵复制,无非是二重循环进行赋值操作,所以今天想改用利用memcpy进行复制操作,当然一维数组的复制在上一篇文章已经练习过了 需要注意的问题是: 复制的本质是利用:行+变量字节数*列  这种表达,所以目标数组的行数一定是固定的 刚开始想到项目中行数是未知的,默认为空,结果程序逻辑问题,不停的溢出,所以要小心 #include <stdio.h> void print(int *data,size_t m,s

二维数组和二级指针作为参数传给参数的方式

  一.如果要将二维数组传给一个函数,有几种传参方式?     1).直接将二维数组传给函数.     eg:         void test(int arr[3][4]); 2).以数组指针的方式传入.     eg:         void test(int (*arr)[4]); 第一种方式很容易理解.第二方式我们来分析分析.首先将二维数组看作是一个一维数组,有三个元素,arr[0],arr[1],arr[2].每个元素中有四个元素.例如,(arr[0])[0],(arr[0])[1