C语言中二维数组作为函数参数传递的方式

C语言中经常遇到需要将二维数组作为函数参数传递到函数中并进行访问或处理的操作,此处以打印二维数组为例,总结了二维数组作为函数参数的几种方式,包括形参定义、函数中数组元素的访问及函数调用。需要注意的是,虽然方式一和方式二中可以以matrix[row][col]的方式访问到元素,但是并不推荐使用这种方式,因为一旦二维数组作为函数参数,就应当把其数组名当成一个指针看待,同时将二维数组对应的行数和列数也作为参数传递给函数,这样就可以通过指针偏移的方式访问到相应的元素。

1. 方式一
//void printMatrix(int matrix[3][3], int matrixRow, int matrixCol)  // 直接以二维数组方式定义
void printMatrix(int matrix[][3], int matrixRow, int matrixCol)     // 省略第一维
{
	int row, col;

	for (row = 0; row < matrixRow; row++)
	{
		for (col = 0; col < matrixCol; col++)
			//printf("%d ", matrix[row][col]);                      // 以下标方式访问
			//printf("%d ", *(*(matrix + row) + col));				// 以指针方式访问
			//printf("%d ", *(matrix[row] + col));                  // 先通过行下标找到元素所在的一维数组,再以指针方式访问
			printf("%d ", *((int*)matrix + row * matrixCol + col));	// 先强转换,再通过计算下标来访问
		printf("\n");
	}
}

int main()
{
	int matrix[3][3] = { {1, 3, 5}, {2, 4, 6}, {3, 6, 9} };
	int matrixRow = sizeof(matrix) / sizeof(matrix[0]);
	int matrixCol = sizeof(matrix[0]) / sizeof(matrix[0][0]);
	printMatrix(matrix, matrixRow, matrixCol);                     // 此处调用数组直接用数组名
	return 0;
}
2. 方式二
void printMatrix(int (*matrix)[3], int matrixRow, int matrixCol)     // 以数组指针方式定义
{
	int row, col;

	for (row = 0; row < matrixRow; row++)
	{
		for (col = 0; col < matrixCol; col++)
			//printf("%d ", matrix[row][col]);                      // 以下标方式访问
			//printf("%d ", *(*(matrix + row) + col));				// 以指针方式访问
			//printf("%d ", *(matrix[row] + col));                  // 先通过行下标找到元素所在的一维数组,再以指针方式访问
			printf("%d ", *((int*)matrix + row * matrixCol + col));	// 先强制转换,再通过计算下标来访问
		printf("\n");
	}
}

int main()
{
	int matrix[3][3] = { {1, 3, 5}, {2, 4, 6}, {3, 6, 9} };
	int matrixRow = sizeof(matrix) / sizeof(matrix[0]);
	int matrixCol = sizeof(matrix[0]) / sizeof(matrix[0][0]);
	printMatrix(matrix, matrixRow, matrixCol);                     // 此处调用数组直接用数组名
	return 0;
}
3. 方式三
void printMatrix(int** matrix, int matrixRow, int matrixCol)     // 以二级指针方式定义
{
	int row, col;

	for (row = 0; row < matrixRow; row++)
	{
		for (col = 0; col < matrixCol; col++)
			printf("%d ", *((int*)matrix + row * matrixCol + col));	// 只能通过强转再按偏移进行访问
		printf("\n");
	}
}
  • 0
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
里面都是我新手时期学C的时候整理的一些TXT文档,因为分不够了,所以放上来赚点积分,都是很基础的东西,里面的代码都是经过我测试的,保证可用。 (1)输出Hello,world (2)标识符 (3)常量与变量 (4)整型数据 (5)实型数据 (6)复合赋值表达式 (7)自加自减运算符和逗号表达式 (8)顺序结构及数据输出 (9)数据输入 (10)作业练习一 (11)关系运算符和逻辑运算符 (12)选择结构及条件表达式 (13)循环结构,while语句 (14)循环结构,do while语句 (15)循环结构,for语句 (16)字符型数据 (17)字符型数据实例,作业练习二 (18)函数定义 (19)函数应用实例,作业练习三 (20)指针的定义 (21)函数之间地址值的传递 (22)函数返回地址值 (23)一维数组的定义 (24)一维数组应用实例 (25)一维数组应用实例(2) (26)一维数组应用实例(3) (27)二维数组的定义 (28)二维数组的初始化 (29)二维数组与指针 (30)二维数组应用实例 (31)二维数组应用实例(2) (32)用一维数组来存储字符串 (33)字符串的输入与输出 (34)字符串数组 (35)用于字符串处理的函数 (36)字符串应用实例 (37)传给Main函数的参数 (38)函数指针 (39)函数的递归调用 (40)变量作用域和存储类别 (41)编译预处理和不带参数的宏替换 (42)带参数的宏替换和文件包含 (43)动态存储分配 (44)结构体变量的定义与引用 (45)利用结构体变量构成静态链表 (46)利用结构体变量构成动态链表 (47)共用体的定义与应用 (48)位运算符 (49)File文件的数据输出操作 (50)File文件的数据输入操作 (51)判断文件结束函数 (52)fscanf和fprintf函数 (53)fgets和fputs函数 (54)fread和fwrite函数 (55)文件定位函数 c switch的用法 c 避免调试窗口闪退 c 弹出消息窗口 c 等待函数(sleep) c 定义类成员 c 动态分配内存法定义数组 c 返回二维数组 c 方向键键码 c 改变字体颜色 c 绘制图形 c 获得鼠标当前位置坐标 c 检测键盘按键 c 检测鼠标按下事件 c 将整数转换成二进制数并存放到数组 c 结构体问题 c 使用winsock实现server和client(通讯程序) c 随机数发生器 c 图形模式详解 c 网页爬虫 c 写图形界面 c 遗传算法实例 c 在图形界面输出文字 c# List的用法 VS2010如何解决每次编译都要重新生成

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值