C++ 数组长度 以及 数组名作为参数传递给函数 以及 为什么不在子函数中求数组长度...

在看排序,首先是插入排序,思路理清后想用代码实现,然后问题来了:

  如何求数组长度?

如果没记错,在Java中应该是有直接可用的方法的, Python中(序列)也有.len,在C/C++中,字符串倒是有strlen() (需要#include <string.h>)


一个办法是用 sizeof()

一、
首先定义数组
  int array[] = {18,10,15,7,1};

一开始想都没想就直接在子函数里面
int array_length(int a[]){
    int len = sizeof(a)/sizeof(a[0]);
    
    return len;
}
然而在主函数中调用的结果并不是5 ,而是8 。


如果把子函数中的代码直接用到主函数中,则能得到正确的答案 5
#include <iostream>

int main(int argc, const char * argv[]) {    
    int array[]={18,10,15,7,1};
    int len = sizeof(array)/sizeof(a[0]);

    cout<<len<<endl;
}

改变数组元素数量和内容,还是这样。比如数组元素增加到6个,如果用子函数,则还是得到8,如果在主函数中直接用sizeof(),则得到6

奇怪了,同样的代码,在main()里面好好的,到了子函数里面咋就不行了?


二、

这篇文章指出:
  参数的传递是将实参的值赋给形参。然而对于数组来说却是一个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的  地址,函数在需要用到后面元素时再按照这个地址和数组下标去查找。也就是说后面的元素根本没到函数里来,所以在函数里求不出数组的大小也就不足为奇了。
/******因此写形式参数时既可以
int array_length(int a[]){
    return 0;
}
*******/
/*******也可以
int array_length(int *a){
  return 0;
}
*******/


而此时(在子函数中)再用sizeof(a),则得到的是指针的长度(这里“指针的长度”这个表述可能有问题,该怎么精确表达呢?),由于是64位的机子,地址为64位,也就是指针为64位,即8(字节)

(sizeof(a[0]) 还是4, 其中a[]是int型数组)

另一方面,在子函数中另外的操作,比如拿数组名当指针用的 a++,还是和main()里面一样
#include <iostream>

void length(int a[]){
    cout<<sizeof(a[0])<<endl;
    cout<<*a++<<endl;
    cout<<*a++<<endl;
    cout<<*a++<<endl;
}

int main(int argc, const char * argv[]) {    
    int a[]={65,66,67,68,1,1,2,10,15,7,1}; 
    length(a);

    return 0
}

//输出的结果是
//    4
//    65
//    66
//    67
输出结果显示,子函数内还是按照首地址以及数组类型的长度来递增。
如果是排序,在子函数里面修改了地址所对应的内容,主函数再调用的时候内容也已经变了,也就是对内存中的数据进行了操作,影响了实参。所以可以不用返回数组什么的,直接用void 类型的子函数就好了。



三、
最后,总结一下解决方案
(假设有 int a[5];)
Solution 1.1:
//to get the length of the array int length = sizeof(a)/sizeof(a[0]);
Solution
1.2: 如果子函数中要用到数组长度,还是如这篇文章所说: 一般是先在外面把数组长度算好了,再作为作为参数传进去。

 

 





//至于用 宏定义 / 类 等方法,以后再研究
//再加一句,能用google就不要用度娘,搜索质量高的不是一点半点,省下的时间不是一点半点。

附:
1). mac如何显示是 32位/64位机器
2). 32位机指针为什么是4个字节 64位与32位机的区别

转载于:https://www.cnblogs.com/Cmfvacks-IsLjj/p/4779482.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值