主题:初学者继续求问。。
abcwuhang
[专家分:1840] 发布于 2011-07-14 12:10:00
#include <iostream>
using namespace std;
double average(int a[10],int len)
{
double sum=0.0;
cout<<sizeof a/sizeof a[0]<<" "<<len<<endl;
for (int* p=a;p<a+len;p++)
sum+=*p;
return sum/len;
}
int main()
{
int values[]={1,2,3,4,5,6,7,8,9,10};
cout<<sizeof values/sizeof values[0]<<endl;
cout<<average(values,10)<<endl;
return 0;
}
本来average函数用来求那10个数的平均数。。。但是点解第六行里输出的两个数不同。。。后面是数组实际长度10,而前面应该也是10,但是输出了1。。。。。。
回复列表 (共8个回复)
沙发
bruceteen [专家分:42660] 发布于 2011-07-14 13:18:00
double average(int a[10],int len)
等同于
double average(int a[111111],int len)
等同于
double average(int a[],int len)
等同于
double average(int * const a,int len)
不知道你听明白了没有
板凳
abcwuhang [专家分:1840] 发布于 2011-07-14 18:29:00
。。偶是想问点解函数里面sizeof a/sizeof a[0]无法正确求出数组元素个数。。
如果实在不行的话,有没有什么方法可以只往函数里传入数组就能求出数组元素个数?
3 楼
abcwuhang [专家分:1840] 发布于 2011-07-15 10:49:00
ding..
4 楼
zhqtdhzh [专家分:70] 发布于 2011-07-16 17:20:00
为何长度变为2,楼主没有点想法?看看你楼上的回答。
----------------------
C是不聪明的语言。像数组这样的聚合(aggregation)式数据是无法按一个量传递的。你调用时要,把数组的地址(和长度)传出去。然后对被调用的函数来说,我获得一个地址,用于管理一个数组。注意此时那个数组,意义上,已经变成某块位于外部的数据结构/外部内存的一个单纯概念。唯一能用于管理的线索就是一个起始地址(就是指针)和一个长度。
--------------------
average()的声明改成
double average(int *a,int len);或
double average(int a[],int len);
函数定义内部也要改。
传数组时改成
cout<<average(&values,10)<<endl;
5 楼
labacher [专家分:0] 发布于 2011-07-18 10:40:00
学习了
不过我觉得4楼后面讲的有点问题
6 楼
nightco [专家分:0] 发布于 2011-07-21 01:17:00
[quote]。。偶是想问点解函数里面sizeof a/sizeof a[0]无法正确求出数组元素个数。。
如果实在不行的话,有没有什么方法可以只往函数里传入数组就能求出数组元素个数?[/quote]
sizeof a/sizeof a[0] ??
你是想用 sizeof 数组占用的内存空间/sizeof 每个数组占用的内存空间 来求出数组个数吧?正确应该是:sizeof(数组在内存占的字节数)/sizeof (数据类型在内存占的字节数)。比如
sizeof(a)/sizeof(int)
7 楼
cgl_lgs [专家分:21040] 发布于 2011-07-21 11:02:00
[quote][quote]。。偶是想问点解函数里面sizeof a/sizeof a[0]无法正确求出数组元素个数。。
如果实在不行的话,有没有什么方法可以只往函数里传入数组就能求出数组元素个数?[/quote]
sizeof a/sizeof a[0] ??
你是想用 sizeof 数组占用的内存空间/sizeof 每个数组占用的内存空间 来求出数组个数吧?正确应该是:sizeof(数组在内存占的字节数)/sizeof (数据类型在内存占的字节数)。比如
sizeof(a)/sizeof(int)[/quote]
你回答错了。
正确的答案是因为:数组在以参数方式传递给函数时,它会降级为指针。所以这个数组的sizeof信息就会随之丢失。
8 楼
sanzoh [专家分:40] 发布于 2011-07-21 16:29:00
4# 是滴 不好意思[em12] 糊涂了。。
lgs纠正的对
我来回复