免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: aaaab
打印 上一主题 下一主题

如何通过指向数组的指针获得该数组元素的个数? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-06-07 15:43 |只看该作者

回复 #20 Godbach 的帖子

你试过没有?

论坛徽章:
0
22 [报告]
发表于 2008-06-07 16:06 |只看该作者
原帖由 Godbach 于 2008-6-7 10:03 发表


假设定义数组 int keytab[20];

keytab,本身就代表一个地址,是数组的首地址,等同于&keytab[0], 表示成指针类型是 (int*), 因此keytab+1就相当于指向数组的第二个元素keytab[1];

&keytab,是对整个数 ...

这个应该是返回一个单位.
答案永远是1

论坛徽章:
0
23 [报告]
发表于 2008-06-07 16:07 |只看该作者
谢谢大家的帮助

论坛徽章:
0
24 [报告]
发表于 2008-06-08 12:26 |只看该作者
原帖由 204tian 于 2008-6-7 15:43 发表
你试过没有?

反问

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
25 [报告]
发表于 2008-06-08 16:06 |只看该作者
原帖由 Godbach 于 2008-6-6 15:52 发表
可以这样吧:
(&keytab+1) - &keytab

哦,这个只可以计算长度


不好意思,这样确实不能正确计算出整个数组的长度。这相当于p+1 - p.确实是1.
但这里并不是代表两个之间是1个字节。而是代表两个指针之间的距离是该指针指向元素的长度。因为这是一个数组指针。p+1就可以将指针直接直到数组最后一个元素的下一个地址。

正确的用法是:len = (unsinged long)(&keytab+1) -(unsinged long)(&keytab)

我只是在GDB下观看这两个指针里面的地址,发现是相差一个数组的长度,但是在计算的时候不能直接那样用。大意了。

没有调查,就没有发言权,确实说的很好。

论坛徽章:
0
26 [报告]
发表于 2008-06-10 22:52 |只看该作者
由于这个时候数组作为函数参数, keytab自动蜕化为指针


sizeof(keytab) = 4
所以没办法用
count = sizeof(keytab)/sizeof(keytab[0])   


为什么我在VC下却是sizeof(keytab) =88,sizeof(keytab[0])=8,所以sizeof(keytab)/sizeof(keytab[0]) =11,呵呵

论坛徽章:
0
27 [报告]
发表于 2008-06-11 10:12 |只看该作者
请看 c专家编程,上面说的很详细
解决方法
1.把长度参数传进来,或者任何类似的方法(struct 什么地...,反正我不用全局变量)
2.加结束标志位,像str那样
其他不管在上边怎么倒,都是不行地...,宏什么的,和直接写有区别吗?

论坛徽章:
0
28 [报告]
发表于 2008-06-11 10:18 |只看该作者
25楼的精妙,但是晦涩,搞不好连怎么死的都不知道;建议模仿字符串加结束标志,简单明了。

论坛徽章:
0
29 [报告]
发表于 2008-06-11 10:29 |只看该作者
25楼的也解决不了问题吧

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
30 [报告]
发表于 2008-06-11 10:33 |只看该作者
原帖由 ms04011 于 2008-6-11 10:18 发表
25楼的精妙,但是晦涩,搞不好连怎么死的都不知道;建议模仿字符串加结束标志,简单明了。


惭愧。有点奇技淫巧。应该不是通用的方法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP