指针讲解(再提一壶)

本文解释了一维数组传参的本质,强调了使用首元素地址而非整个数组进行传递以节省空间。讨论了数组名、首元素地址的区别,以及为何在for—printf中使用数组名接收。同时提到了解引用的概念和数组元素的访问方式。
摘要由CSDN通过智能技术生成

书接上文:上文链接指针讲解(醍醐灌顶)-CSDN博客上文是这个文章的基础,最好理解了再看这个,当然如果的大佬的话,你爱咋地咋地

我们建一个数组比如arr【10】,而这个数组的数组名就是首元素的地址

这个数组名是不是一直都是首元素地址呢,既然我都问了那就肯定不是了啊。就是二个例外

sizeof(数组名)在这种情况下,数组名表示整个数组,计算的是整个数组的大小。,单位是字节

还有一个就是&arr,这里表示的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的,我先大概说一下,满足一下大家的好奇心,虽然这二个地址在数值上都是一样的但是,首元素 的地址,他的指针是指向一个元素的指针假如这是一个int型的,因此加一就是向后跳4个字节,而整个数组的地址就是一个指针指向一个数组,加一就是跳过一个数组的大小,能理解不,理解不了也没关系,因为我后面,还是下一张讲)

有了这些基础我们就可以,使用指针来访问数组了。

另外说一个arr【10】,这个表示arr的第11个元素,但是电脑在计算的时候会把这个以arr【0】+10,来计算。这个是什么意思呢,首先,在内存中我们知道数组的元素储存是连续的,因此,第一个元素后面就是第二个元素,这样,电脑只要知道了数组首元素就可以计算整个数组的地址,而arr【0】就是第一个元素,因此,arr【10】就是第11个元素。

现在,我们先说一下一维数组传参的本质,我们在写了一个main函数的时候,我们想要额外分装一个函数,而那个函数又要用数组,那我们可以如图:

这样传参,但是我们要讲的是本质,而这个只是表面的,我们传arr的时候,有没有想过一个数组,我们到底是怎么传的,在之前我说过一张函数栈帧的讲解,我们传的参是以压栈的形式压进去的,也就是压一个元素,你想如果我们传数组的时候,我们如果把整个数组都传过去,我们现在写的数组确实没有很大,那空间浪费的不多,但是如果这个数组他有成千上万个元素呢,那空间浪费是不是很大,而且可以省的就没有必要浪费了(就像我在网上看到的那个博主,她没有经济来源,她自己认为要省钱,然后她老公买了一个几百的键盘,她就生气了,和她老公吵架,还发到了网上,但是眼尖的网友就发现了她手上戴着黄金镯子,说黄金的必需的,一个有用的键盘就是没用的。大家也就看个乐吧)所以这样还是对空间浪费大,那怎么办呢,对我们在上面说了(想不起来,就去看,就是这章)计算机想要访问一个数组只要有首元素就行了,这样我们只要+的去,就可以访问了,但是留一个心眼我们同时最好把这个数组的总个数传过去,这样计算机的不会因为不知道有多少元素而越界访问了。而我们上面也说了,arr除了两个情况,都是表示首元素地址,两个角度分析都发现arr就是首元素地址,既然我们传的是首元素地址,那我们也是用一个指针接收啊,那为什么在for—printf中接收,我们也是用一个数组呢,没错,因为那个数组名也是首元素地址,就可以接收了,但是又有聪明的小伙伴要说,我们传首元素地址,那我们可不可以用一个指针直接接收,也可以的。我们就用一个指针来接收

但是要注意我在访问的时候没有用arr【元素】来访问了,有人说这是上面访问方法啊,从来没有见过。(有见过的吗)这还没见过,脑子里想没见过的再把上文看一看,我说了arr【10】计算机会把他看为是arr【0】+10。对还是不对。而pa不就是首元素的地址吗。那么首元素的地址向后不就是后面元素的地址吗,*(就是拿到这个地址存放的元素)这个是解引用不会有人不知道吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值