希望能帮助到你,我将无比快乐。
你的点赞✌️,是我前进的动力。

初遇二维数组作函数参数,宛如自己化身为了大头儿子。很头大。

不禁大声呐喊:该怎么声明定义,该怎么调用,又该怎么函数中操作元素和地址?

在此,我要拨开这些问题的一些迷雾。
我相信,有心人看完后,再遇就不会怕了。

其实声明,定义是一样的。因此,只写声明
同时,把元素外层*()剥去就代表地址。因此只写元素
最后有总结。

二维数组作函数参数,依我看来,至少可以分成三种。

事先,在main函数中 int a[m][n];
好了,进入主题。

第一种形参为二维数组

声明

void function(int a[m][n]);//函数声明
void function(int a[][n]);//不论多少维数组,第一维都可省略。//凭什么,第二维就不可省略呢?由编译器的寻址方式决定。

调用

function(a);//函数调用  实参直接写数组名!数组名!(重点)。//(注意)function(a[m][n])或function(a[][n])都不可以!//话说,写数组名多好,简单轻松。

在函数操控元素

1.   *(a[i] + j)  //代表第 i 行 第 j 列
2.  *(*(a+i) + j) //同上
3. *((int *)a +i*n +j )//同上,n表示第二维数组长度,即列宽//不管怎么样,a[i][j]不被允许。也是由编译器的寻址方式决定。

第二种形参为数组指针

(其实只是 声明定义 与第一种不同,其他一样)
声明

void function(int (*a)[n]);
//不是(int *a[n])(指针数组) ,而是(int (*a)[n])(数组指针);
// 缘由是 [] 的 优先级比 *的大

调用

function(a);//函数调用  实参同样直接写数组名!//(注意)function(a[m][n])或function(a[][n])同样都不可以!

在函数操控元素

1.   *(a[i] + j)  //代表第 i 行 第 j 列
2.  *(*(a+i) + j) //同上
3. *((int *)a +i*n +j )//同上,n表示第二维数组长度,即列宽//a[i][j]不被允许。由编译器的寻址方式决定。

第三种形参为二级指针

声明

void function(int **a,int n);n表示第二维数组长度,即列宽

调用

function( (int **)a,int n);//实参不能为数组名!*与上面相反*!有两个 * !//(注意)function(a)或function((int *)a)不可以!

在函数操控元素

 *((int *)a +i*n +j )//只有一种!n表示第二维数组长度,即列宽//其他不被允许。由编译器的寻址方式决定。

总结
声明定义(分三种)。
二维数组,数组指针,二级指针。(都是指针)
调用(一对一,二对二)
数组指针,二维数组就写一级指针即 数组名.
二级指针就写二级指针即 (int**)数组名
在函数中操作元素(注意二级指针,只能用最后的方法)

  1. *(a[i] + j) //代表第 i 行 第 j 列
  2. *( *(a+i) + j) //同上
  3. *( (int * )a +i * n +j )//n表示第二维数组长度(列宽)
    也就是说 3. 是万能的。

声明,定义是一样的。
同时,把元素外层
()剥去就代表地址。

喜欢就为我点赞,评论加收藏。
转载请标明出处[link]https://blog.csdn.net/qq_43868654/article/details/84641383

C语言:二维数组传参的格式(详细+总结)相关推荐

  1. 【概念辨析】二维数组传参的几种可能性

    一.二维数组传参竟然不是用二级指针进行接收? 今天进行再一次的二级指针学习时,发现了一条以前没怎么注意过的知识点:二维数组进行传参只能用二维数组(不能省略列)进行接收或者是数组指针.         ...

  2. 什么是二维数组以及二维数组传参

    什么是二维数组 当刚看见二维数组时肯定会对二维数组有一些疑惑二维数组是什么? int arr[4] = { 1,2,3,4 };//这个便是一维数组 以 int 类型为例子当 int 类型的元素集合在 ...

  3. 二维数组传参||传值

    先给出问题: 像下面这样的数组,在函数中如何传参?也就是说如何保证虚参与实参类型一致. char str_arr[3][10] = {"yes","no",&q ...

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

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

  5. 漏刻有时API接口实战开发系列(13):小鹅通云服务PHP-API二维数组传参解决方案

    在使用小鹅通云服务API开发过程中,当传递二维数组时,后台总是提示The user id list must be an array.即传递的参数必须是数组. 文档请求标准格式 {"acce ...

  6. 关于二维数组传参做形参

    二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,它的形参该怎样写?要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型. 正确 ...

  7. 如何把二维数组传参给函数

    1.传递"数组指针" #include <stdio.h>void output( int (*pa)[3], int n ) //这个函数只能输出n行3列的二维数组 ...

  8. 多维数组之二维数组传参、返回值、申请内存问题

    目录 多维数组 存储顺序 二维数组基础知识 数组名 下标 指向数组的指针 二维数组使用 初始化 作为函数参数的二维数组 二维数组返回值与申请内存问题 多维数组 如果某个数组的维数不止1个,它就被称为多 ...

  9. C/C++语言二维数组的传参方法总结

    原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/8886687,作者:gqb666 C/C++语言将二维数组 ...

  10. 【让你从0到1学会C语言】指针/数组传参以及static关键字

    作者:喜欢猫咪的的程序员 专栏:<C语言> 喜欢的话:世间因为少年的挺身而出,而更加瑰丽.                                  --<人民日报> ...

最新文章

  1. git 忽略指定文件夹的上传
  2. eSpeak: Linux 文本转语音工具
  3. Android使用SQLite数据库(1)
  4. apache2 默认端口修改
  5. 金融领域下的数据挖掘算法应用:逻辑回归模型
  6. Mangos源码分析(3):服务器结构探讨之简单的世界服实现
  7. gRaphael——JavaScript 矢量图表库:两行代码实现精美图表
  8. SAP 产品 UI 里的容器组件的概念和开发概述
  9. Windows访问令牌相关使用方法
  10. (计算机组成原理)第四章指令系统-第一节2:扩展操作码
  11. windows上编译和安装hadoop2 (一)
  12. 计算机无法创建新文件夹,无法创建文件,小编教你无法新建文件夹怎么办
  13. 基于Python的飞机大战游戏系统设计与实现
  14. IAP商品修改和数据获取,一文带你全部搞懂
  15. 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
  16. 内置方法和模块的应用
  17. 企业文件防泄密整体解决方案
  18. 关于四芯网线上网的奇怪问题
  19. Sybase 报错码 JZ0SA 、JZ0SB、JZ0S3、JZ0R2
  20. 有数Bizhelp帮助文档在线制作软件官方

热门文章

  1. 使用QRCode.js生成二维码
  2. 我所理解的生活(韩寒)
  3. Uncode-DAL 1.0.18 发布,Java 通用数据访问层
  4. 2021年全国职业院校技能大赛(中职组)网络安全竞赛试题(3)(总分100分)
  5. scum服务器在线玩家,SCUM服务器选择推荐 官服跟私服有什么区别
  6. 一个非常好用的免费图床
  7. AcrGIS 做成本距离分析时提示ERROR 999999:无法启动配置 RasterCommander.ImageServer
  8. Windows10桌面IE浏览器图标无法删除的解决方案
  9. 基于属性词补全的武器装备属性抽取研究
  10. html5在线视频编辑器,WeVideo:视频编辑器