数组做函数参数(无法计算长度解决办法)

1.问题描述

数组做函数的参数时,在函数体中无法正确计算数组中的元素个数。

#include<iostream>
using namespace std;

void test01(int* arr)  //参数也可写为(int arr[])无需指明数组长度
{
	int len1 = sizeof(arr) / sizeof(arr[0]);
	cout << "数组中元素个数为:" << len1;

}

int main()
{
	int a[9] = { 1,2,3,4,5,6,7,8,9 };
	test01(a);
}

 运行结果>>数组中元素个数为:2

2.原因

经过查找资料,函数中求出数组长度位2的原因主要有以下几点:

 1)sizeof是C语言中32个关键字中的一个,注意它是关键字而不是函数!其求值是在编译时进行的,所以不能能够动态的确定一个变量的值。

 2)传数组给一个函数,数组类型自动转换为指针类型,因而实际传的是地址,所以系统是不知道该数组是在哪里截止的,因此不会得到数组的长度。

3)数组名的值就是数组首元素的地址,函数中的sizeof(arr)求的时指针所占的内存,指针变量在64位系统下占8个字节,8字节对应64位,刚好可以表示64位系统的寻址范围。所以结果才会是2,而不是常说的整形指针占4字节。

3.分析总结

  首先,所有传递给函数的参数都是通过传值方式进行的,传递给函数的都是参数的一份拷贝。

  接着,当传递的参数是一个指向某个变量的指针时,函数将对该指针执行间接访问操作(拷贝指针,并访问所指向的内容),则函数就可以修改指向的变量。

  数组做函数参数时,只可做实参。

解决函数体内无法求数组长度的方法:

 1)将数组长度在函数体外计算,并作为形参传入函数体中。

void test01(int* arr,int len)

 2)使用 引用数组 做实参,但是此时必须指明数组长度。

void test01(int (&a)[9] )

  

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早点睡嘛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值