VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1025|回复: 8

数组首地址求数组空间

[复制链接]
31_avatar_middle
最佳答案
0 
在线会员 发表于 2021-10-20 11:19:47 | 显示全部楼层 |阅读模式
数组在函数中传递时为地址传递,请问
怎么通过传入的数组的首地址获取原数组的空间大小?




上一篇:为何vc6 不需要加_T
下一篇:萌新求助,long long 怎么不能用
07_avatar_middle
最佳答案
12 
在线会员 发表于 2021-10-20 11:47:19 | 显示全部楼层
这个问题,数组通过参数传递的时候实际上传递的是一个指针。

你要通过传入的数组的首地址获取原数组的空间大小,实际上就是想通过一个指针去获得这个指针可以访问的空间的大小。我们知道,C/C++里通过裸指针加上一定的偏移量就能访问对应的内存空间,操作系统只有在你访问非法内存的时候会给出错误,注意,这是在访问之后才会引发错误,而不是在你访问之前进行错误预警。
所以,在不添加外部信息的情况下,通过一个裸指针去确定它的可访问区域,实际上是不可行的。
31_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-10-20 11:54:28 | 显示全部楼层
freehawkzk 发表于 2021-10-20 11:47
这个问题,数组通过参数传递的时候实际上传递的是一个指针。

你要通过传入的数组的首地址获取原数组的空 ...

是啊,所以在《实用c++》第22课,课后作业中,编写的函数传递的只有首地址,没有大小,这道题设计的是不是有点问题啊,还是有解题答案?数组首地址求数组空间
31_avatar_middle
最佳答案
62 
在线会员 发表于 2021-10-20 15:22:54 | 显示全部楼层
恩宇方泽 发表于 2021-10-20 11:54
是啊,所以在《实用c++》第22课,课后作业中,编写的函数传递的只有首地址,没有大小,这道题设计的是不 ...

题是没问题的,知识是死的,人是活的,编程最重要的是灵活多变,数组传到函数内 sizeof 取到的是数组首地址的 size,既然函数内取不到正确的size,为什么不传过去呢!

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
00_avatar_small oyxbl + 1 + 1 赞一个!

查看全部评分

31_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-10-21 12:27:55 | 显示全部楼层
cpp2019 发表于 2021-10-20 15:22
题是没问题的,知识是死的,人是活的,编程最重要的是灵活多变,数组传到函数内 sizeof 取到的是数组首地 ...

嗯呢,谢谢。我也觉得应该是要传入首地址和数组中元素的个数。
只是想课件中说创建的函数的定义格式中没包含传入的个数,是不是改一下更好些。
00_avatar_middle
最佳答案
13 
在线会员 发表于 2021-10-21 15:35:44 | 显示全部楼层
恩宇方泽 发表于 2021-10-21 12:27
嗯呢,谢谢。我也觉得应该是要传入首地址和数组中元素的个数。
只是想课件中说创建的函数的定义格式中没 ...

纯c才需要多带一个参数来储存数组长度  或者直接diy一个类

c++我们一般用容器来传递数组   

数组首地址求数组空间

22_avatar_middle
最佳答案
0 
donate_vip 发表于 2021-10-23 09:31:27 | 显示全部楼层
恩宇方泽 发表于 2021-10-20 11:54
是啊,所以在《实用c++》第22课,课后作业中,编写的函数传递的只有首地址,没有大小,这道题设计的是不 ...

有的时候一条道走不通,干嘛非得走到底?既然函数内部获取不到数组长度,那就在函数外部定义一个变量来存放这个长度,局部变量不行就全局变量,变则通,通则达。初学阶段也别管什么效率不效率的,以后代码读多了再学习人家的思维,现在用自己的本能去解决问题先
00_avatar_middle
最佳答案
10 
在线会员 发表于 2021-10-24 16:23:37 | 显示全部楼层
你可以自己用结构体或者类自己封装一个数组,里面可以装它的长度和大小,直接传进去在函数里面是获取不到的,其他语言能获取就是因为他们已经给封装成类了。传进去的只有首地址,至于偏移最大取到多少,写死还是动态的,这个就得自己控制了。

楼上的方法很可取。直接在传参的时候多传一个大小就好了。

现在都有给你封装好的模板类,C++自带的,效率还高
22_avatar_middle
最佳答案
0 
donate_vip 发表于 2021-10-25 01:04:27 | 显示全部楼层
本帖最后由 liang9539 于 2021-10-25 01:10 编辑

给你个示例,自己应用看看
  1. template <class T>
  2. void getArraSizeInFuncAsAnArgc(T& arr)
  3. {
  4.     int len = sizeof(arr)/sizeof(arr[0]);
  5.     cout << len <<endl;
  6. }

  7. int main()
  8. {
  9.     int a[10]; //定义一个有长度的数组
  10.     getArraSizeInFuncAsAnArgc(a);
  11.     return 0;
  12. }
复制代码


手打代码,可能有错漏,自己排下错,我没运行过
好用请给个最佳,谢谢
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-12-8 18:22

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表