c语言二维数组传参数_c语言数组传参

c语言二维数组传参数_c语言数组传参初遇二维数组作函数参数,宛如自己化身为了大头儿子。很头大。不禁大声呐喊:该怎么声明定义,该怎么调用,又该怎么函数中操作元素和地址?在此,我要拨开这些问题的一些迷雾。我相信,有心人看完后,再遇就不会怕了。其实声明,定义是一样的。因此,只写声明。同时,把元素外层*()剥去就代表地址。因此只写元素。最后有总结。二维数组作函数参数,依我看来,至少可以分成三种。事先,在main函数中int…

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

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

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

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

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

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

事先,在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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230777.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ubuntu 18.04通过deb安装cuda 10.2

    Ubuntu 18.04通过deb安装cuda 10.2wgethttps://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pinsudomvcuda-ubuntu1804.pin/etc/apt/preferences.d/cuda-repository-pin-600wgethttps://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installer

    2022年5月9日
  • @Mapper 与 @MapperScan 的区别[通俗易懂]

    @Mapper 与 @MapperScan 的区别[通俗易懂]文章目录1、@Mapper注解2、@MapperScan2.1、@MapperScan扫描多个包2.2、@MapperScan使用表达式,来扫描的包和其子包下面的类3、总结:1、@Mapper注解作用:用在接口类上,在编译之后会生成相应的接口实现类位置:对应的某个接口类上面@MapperpublicinterfaceEmployeeMapper{publicEm…

    2022年6月6日
  • 关于SOAP调用返回对象的写法 wsdl webservice

    关于SOAP调用返回对象的写法 wsdl webservice

    2021年5月4日
  • 项目范围管理知识领域共有六个过程_项目范围管理的主要内容

    项目范围管理知识领域共有六个过程_项目范围管理的主要内容项目范围管理项目范围管理包括确保项目做且只做所需的全部工作,以成功完成项目的各个过程。管理项目范围主要在于定义和控制哪些工作应该包括在项目内,哪些不应该包括在项目内项目范围管理的各个过程,包括:5.1规划范围管理一创建范围管理计划,书面描述将如何定义、确认和控制项目范围的过程。5.2收集需求—一为实现项目目标而确定、记录并管理干系人的需要和需求的过程5.3定义范围——制定项目和产品详细描述…

    2022年9月16日
  • intellidea激活码[最新免费获取]「建议收藏」

    (intellidea激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月27日
  • python获取文件名后缀名_python获取文件名不含后缀名

    python获取文件名后缀名_python获取文件名不含后缀名importosfile_path=”/home/admin/Desktop/test.py”filepath,tempfilename=os.path.split(file_path)filename,extension=os.path.splitext(tempfilename)filepath文件目录filename文件名extension文件扩展名…

    2022年9月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号