目录

函数参数传递二维数组的问题

解决方案

1.传递第二维和更高维的大小

2.根据数组的存储原理把二位数组当作一维数组来操作(降维处理)


函数参数传递二维数组的问题

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

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

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

p + i*n + j;

从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确的寻址。

这与数据类型类似,试想如果没有数据类型的区别,编译器如何寻址呢?8位的还是16位的?还是32位的?也就是编译器必须要知道它一个单元占多长的内存,至于内训里有多少个单元,是可以不用知道的。

举个形象的例子,这里有一堆苹果,老板让你把他们装起来。试想,你问老板“这总共是多少筐”重要还是问老板“一筐装几个”重要?只要老板告诉你一筐装几个,你管他能装几筐!老板知道就行了,你就不用管了。

在编译一维数组形参的函数原型时,既可以把它写成数组的形式,也可以把它写成指针的形式,但是对于多维数组,只有第一维可以进行如此选择!想要把二维数组形参的函数原型写成下列这种方式是不对的:

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

解决方案

那问题就来了,我们该怎么传递二维数组参数呢?

总的来说解决方法有两个

1.传递第二维和更高维的大小

既然第二维和更高维度的大小必须指定,那就指定好了。但是既然指定了该函数参数中的二位数组的大小,就要经常根据使用情况对其大小进行修改,所以最好定义为一个宏定义。代码如下

#include <stdio.h>#define M 4
#define N 6
int A[M][N] = {{1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18},{19,20,21,22,23,24},
};void ArrayPrint(int A[][N], int m, int n);//遍历打印二维数组A[i][j]
int main()
{ArrayPrint(A,M,N);return 0;
}void ArrayPrint(int A[][N],int m,int n)//遍历打印二维数组A[i][j]
{int i, j;for (i = 0; i < m; i++){for (j = 0; j < n; j++){printf("%d\t", A[i][j]);}printf("\n");}
}

此外前文说到,在编译一维数组形参的函数原型时,既可以把它写成数组的形式,也可以把它写成指针的形式,但是对于多维数组,其第一维可以进行如此选择!因此第一维度也可以改为指针:void ArrayPrint(int (*A)[5], int n, int m)

2.根据数组的存储原理把二位数组当作一维数组来操作(降维处理)

前面已经提到,即使是二维数组,其在内存中的存储也是顺序的存储。

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

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

p + i*n + j;

既然这样,我们就也可以通过指针来寻址二维数组。也就是说我们传递一个指向二维数起始内存的指针就可以实现对二维数组的操作,那我们只需要传递一个指向二维数组的首地址的指针就行了。示例代码如下

#include <stdio.h>#define M 4
#define N 6
int A[M][N] = {{1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18},{19,20,21,22,23,24},
};void ArrayPrint(int* A, int m, int n);//遍历打印二维数组A[i][j]
int main()
{ArrayPrint(&A[0][0],M,N);return 0;
}void ArrayPrint(int *A,int m,int n)//遍历打印二维数组A[i][j]
{int i, j;for (i = 0; i < m; i++){for (j = 0; j < n; j++){printf("%d\t",*(A + i * n + j));}printf("\n");}
}

C/C++函数传递二维数组相关推荐

  1. 黑马程序员——c语言学习心得——函数传递二维数组

    黑马程序员--c语言学习心得--函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.    变量 ...

  2. c语言字符二维数组传参,C语言函数传递二维数组

    C语言如果给函数传递二维数组作为参数 问题的产生 先看一个传递二维数组的例子: #include void foo(int a[][], int m, int n) { int i = 1; int ...

  3. C/C++如何传递二维数组?

    用二维数组作为参数传递(用二维数组处理矩阵),但是希望接受传递二维数组参数的函数可以处理任意维度的数组(希望矩阵的行数和列数都是不固定的). ----------------------------- ...

  4. C语言给函数传二维数组

    害,菜鸡真的是走一步一个坑,有时间一定得系统学习一下c了. 言归正传,给函数传递二位数组,我目前可以掌握的有三种方法: 1.将二维数组压缩成一维数组,然后就可以正常用指针了,用的时候注意一下二维与一维 ...

  5. boost::python模块包装几个 C++ 函数 将二维数组操作为采用 NumPy 数组的 Python 函数作为参数

    boost::python模块包装几个 C++ 函数 将二维数组操作为采用 NumPy 数组的 Python 函数作为参数 实现功能 C++实现代码 实现功能 boost::python模块包装几个 ...

  6. 二维数组作为形参,传递二维数组的值

    二维数组作为形参,传递二维数组的值 void trfind(int (*Array)[3]); void trfind(int (*Array)[3]) {int a[][3] = {1, 2, 3, ...

  7. matlab 二维数组声明,Matlab字符串函数及二维数组

    Matlab字符串函数及二维数组 发布时间:2017年07月28日 评论数:抢沙发 阅读数:833 strcmp(Str1,Str2),finder(S,s),strcat(S1,S2),disp(s ...

  8. c++ sort()函数对二维数组vector排序

    c++ sort()函数对二维数组vector排序 sort (first, last) 对容器或普通数组中 [first, last) 范围内的元素进行排序,默认进行升序排序. 对于一个一维的数组, ...

  9. c语言sort函数排序二维数组,js 二维数组排序sort()函数

    一.按数值排序 var arr = [[1, 2, 3], [7, 2, 3], [3, 2, 3]]; arr.sort(function(x, y){ return x[0] – y[0]; }) ...

最新文章

  1. 鹿妮倍半机器人_功能纳米组装体中多面体低聚倍半硅氧烷的旋压
  2. 数字图像处理与python实现 pdf_正版 数字图像处理与Python实现 高等院校计算机科学 人工智能 信号与信息处理 通信工程等专业的...
  3. dp括号匹配 网易面试题_面试题:大括号验证
  4. 京东炸年兽活动一键做任务工具v1.7
  5. java list 内存分页_Java List内存分页
  6. 【kafka】kafka 启动 Version `123123` is not a valid version
  7. linux 重复模式元字符,Linux 正则表达式 vi, grep, sed, awk
  8. 第二期!团队开发spring会议~day8
  9. WIN10 WIN11的vs2019与fortran编译环境的安装
  10. 【软件工具使用】高效使用 Visio 绘图
  11. 使 div 水平 垂直 居中
  12. 转换为ico格式图片
  13. 2019-CVPR-上交-(DAIN)Depth-Aware Video Frame Interpolation
  14. asp毕业设计——基于asp+access的校园网上购物平台设计与实现(毕业论文+程序源码)——网上购物平台
  15. 记一次小米2S的刷机过程
  16. Android Studio部分汉化中文包 MarkDown格式
  17. android检测usb设备——usb打印机
  18. 平安科技性格测试凉经
  19. 当你的移动硬盘弄坏了你的文件该如何恢复呢
  20. 【Oracle】使用Function计算去除周末及法定节假日天数

热门文章

  1. Snaker如何配置期望完成时间、提醒时间、重复提醒间隔
  2. 博客生成静态站点工具 Top 30
  3. 导入镜像报错解决方法
  4. Virtual Villagers 攻略
  5. JS 即时刷新验证码图片代码
  6. 鱼骨图和甘特图图表合集PPT模板-优页文档
  7. (三十) Ubuntu解决/boot 空间不足问题
  8. carbondata 介绍
  9. 成都UI设计培训机构如何选择?
  10. Java汽车租赁管理系统