数组传参的本质

前言 我们知道sizeof关键字是用来计算变量或者类型所占内存空间的大小(单位:字…

在这里插入图片描述

前言

我们知道sizeof关键字是用来计算变量或者类型所占内存空间的大小(单位:字节)。那sizeof(数组的数组名)计算的又是什么呢?其实计算的是整个数组所占内存空间的大小。如下所示:

在这里插入图片描述
上例中的sizeof(arr) / sizeof(arr[0])是用来计算数组元素的个数,其中sizeof(arr)计算的是整个数组所占空间的大小,而sizeof(arr[0])计算的是下标为0的元素所占空间的大小,它两相除结果自然是数组元素的个数。


讲解

一.问题
数组传参的本质是传递地址,并不是整个数组传过去。但这是为什么呢?如若把数组传给函数后,再用sizeof的方法计算素组元素的个数会发生什么?下面是个例子,仔细看。

在这里插入图片描述结果怎么会是1呢?哪里出现错误了?

二.原因
编写的程序其实没有出错,只不过你对数组的传参并不了解。你想我们在单值传递的时候,形参可以说是实参的一份临时拷贝,可若在传递数组的时候也建立一份数组的临时拷贝,这时候的空间浪费是非常严重的。因为数组在实际中的使用可不是像我们平时那样只会创建小几十个元素,在实际中是可能上万的,那这样还传递整个数组并不现实。所以我们总结出了一种方法,既可以间接的访问整个数组,又可以不那么浪费内存空间,即:数组在传参的时候,仅仅只是传的首元素的地址。事实也是如此嘛test(arr);中arr是数组名,而C语言中规定:数组名代表的就是数组首元素的地址

在这里插入图片描述
如你所见,我们在计算test()函数中的sizeof(arr)时,大小就只有4个字节,根本性原因就是传递过来的arr只是一个地址,而地址在内存中占用的空间无非就是4个字节或8个字节(而由于我这里是在32位平台上创建的程序所以是4个字节)。所以数组在传参的时候传递的是首元素的地址,事实上也是如此。

三.补充说明
通过上面那番讲解,有些人还是不死心,他们说:函数在定义void test(int arr[])的时候,创建的形参“ int arr[] ”明明是数组啊。这里我想说的是,千万别被它的表现所迷惑,这里的“ int arr[] ”本质上创建的不是数组,而是一个指针变量,它这是在挂羊头卖狗肉啊,千万别上当!!!所以这也是为什么数组传参时,我既可以创建数组形参来接收,也可以用一个指针来接收的原因了。


总结

通过上面的讲解,一定要牢记数组传参的本质时什么,还有就是下次再使用sizeof(arr) / sizeof(arr[0])这种方法来计算数组元素的个数的时候,千万记住下面这句话:在函数内部计算一个函数参数部分的数组的元素个数是不靠谱的,除非你想出错。


在这里插入图片描述

这份博客👍如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位🔎点赞👍评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧👀。

本文来自网络,不代表软粉网立场,转载请注明出处:https://www.rfff.net/p/1986.html

作者: HUI

发表评论

您的电子邮箱地址不会被公开。

返回顶部