回 帖 发 新 帖 刷新版面

主题:初学者继续求问。。

#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个回复)

沙发

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)

不知道你听明白了没有

板凳

。。偶是想问点解函数里面sizeof a/sizeof a[0]无法正确求出数组元素个数。。

如果实在不行的话,有没有什么方法可以只往函数里传入数组就能求出数组元素个数?

3 楼

ding..

4 楼

为何长度变为2,楼主没有点想法?看看你楼上的回答。
----------------------
C是不聪明的语言。像数组这样的聚合(aggregation)式数据是无法按一个量传递的。你调用时要,把数组的地址(和长度)传出去。然后对被调用的函数来说,我获得一个地址,用于管理一个数组。注意此时那个数组,意义上,已经变成某块位于外部的数据结构/外部内存的一个单纯概念。唯一能用于管理的线索就是一个起始地址(就是指针)和一个长度。
--------------------
average()的声明改成
double average(int *a,int len);或
double average(int a[],int len);
函数定义内部也要改。

传数组时改成
cout<<average(&values,10)<<endl;

5 楼

学习了 
 不过我觉得4楼后面讲的有点问题  

6 楼

[quote]。。偶是想问点解函数里面sizeof a/sizeof a[0]无法正确求出数组元素个数。。

如果实在不行的话,有没有什么方法可以只往函数里传入数组就能求出数组元素个数?[/quote]


sizeof a/sizeof a[0]  ??
你是想用 sizeof 数组占用的内存空间/sizeof 每个数组占用的内存空间   来求出数组个数吧?正确应该是:sizeof(数组在内存占的字节数)/sizeof (数据类型在内存占的字节数)。比如
sizeof(a)/sizeof(int)

7 楼

[quote][quote]。。偶是想问点解函数里面sizeof a/sizeof a[0]无法正确求出数组元素个数。。

如果实在不行的话,有没有什么方法可以只往函数里传入数组就能求出数组元素个数?[/quote]


sizeof a/sizeof a[0]  ??
你是想用 sizeof 数组占用的内存空间/sizeof 每个数组占用的内存空间   来求出数组个数吧?正确应该是:sizeof(数组在内存占的字节数)/sizeof (数据类型在内存占的字节数)。比如
sizeof(a)/sizeof(int)[/quote]
你回答错了。

正确的答案是因为:数组在以参数方式传递给函数时,它会降级为指针。所以这个数组的sizeof信息就会随之丢失。

8 楼

4# 是滴 不好意思[em12] 糊涂了。。
lgs纠正的对

我来回复

您尚未登录,请登录后再回复。点此登录或注册