数组作为参数的那点事

目录

引言

第一,一维数组作为参数的所以情况

第二,二维数组作为参数的情况


引言

小伙伴们可能觉得我有些大题小做,没必要说,但是,请你看完,绝对有收获(当然大佬除外,还有那些本来就理解了小伙伴)

第一,一维数组作为参数的所以情况

今天给大家带来的是数组作为参数时,遇见的所有情况。有些小伙伴可能有些疑惑,这个不是挺简单吗?实参和形参共用一段内存空间,有什么要说的呢?如果只是这样认为,那你就大错特错了。不仅仅是这么简单(因为我自己在做题时,碰见过挖坑的,所以想给大家说说)。

首先,我们先来说说一维数组作为参数时的一些容易混淆的问题。

我写了这样的代码,如下

 首先,我就不给大家说基础得了,相信大家都会基础的(如果有不会的可以私信问我),实参和形参的类型要相同,这个就不说了,但是我们大部分小伙伴知道,形参数组的方括号里面加不加元素个数都可以。但是很多小伙伴应该都很疑惑,为什么加不加都可以呢?下面大家看看我调试的结果。

大家看看调试板,形参的类型不是数组,是int *类型,这是为啥呢?之所以这样啊,是因为数组名作为实参是,给形参传递的是数组首元素地址,虽然形参我们在定义时,定义成了数组类型,但是编译器会默认为它是指针类型,所以我们看到传过去的首元素的值,并且是int *类型。我们再看看执行了num=num+1的结果

 

看到这,相信许多小伙伴就明白了一些,所以我们每次传参时写的是函数名(数组名,数组元素个数)(因为想让大家看明白,所以我就没有写元素个数)的形式,就是让指针顺藤摸瓜,找到其他元素,并且解引用。那么,形参数组方括号里如果写了元素个数呢?其实是没有区别的,他其实是混淆我们的思路,给大家挖坑的,下面是方括号里加了元素个数的代码以及调试结果 

 

 

我们看到,加不加是没有区别的,所以,方括号加不加元素个数都可以。到这,有些小伙伴就有疑问了,你说的都知道,有必要在写一篇博客吗?错了,大错特错,下面才是真正混淆我们的时候,请看一下代码

 

那如果我们让实参为数组的整个地址呢?请看一下调试完的结果

 

 还是和上面一样,传递的是首元素地址,但是此刻要注意,此时形参的指针类型不是int*了,而应该是int(*)。为什么呢?因为我们知道,数组名代表数组首元素的地址,而取地址数组名代表的则是数组首地址,假设我们定义了一个数组是arr[5],arr+1代表的是arr[1]的地址,并且解引用,而&arr+1则代表的是加了整个数组,使其指向数组的后面,此时其等价于数组指针。和取地址数组名作为实参时一样的道理。形参必须为数组指针的类型才可以。

第二,二维数组作为参数的情况

有些小伙伴们会想,一维数组传参时,形参相当于是一级指针,那二维数组作为形参时,是不是相当于是二级指针?这样想就错了,我们看下面这段代码

我定义了二维数组,没执行fun函数的num=num+1的语句前,调试的结果是

 

 执行了后

 这是为什么呢?为什么不是二级指针呢?我们可以这样理解,一维数组作为参数时,传递的是首元素地址,其实二维数组也是,但是它传递的是num[0]的地址,而形参作为接受地址指针,num[0]代表的是第一行的地址,而num第一行里还有5个元素,所以形参的指针类型是数组指针,只有为数组指针时,才可以接收。

希望大家看完有所收获,最后,希望大家支持一下!!!点一下赞

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值