c语言中的数组和函数

时间:2012-02-07 22:05:58

标签: c arrays sizeof

如果有以下内容,我会得到一些东西:

double average (double scores[]){

 double sum = 0;
 int n;
 int nscores = sizeof(scores)/sizeof(double);
 for (n=0 ;n<nscores ;++n){
 sum+=scores [n];
 return sum/nscores;
}

我发送这个函数是这样的数组:

  double scores[3]={1,2,3};

为什么sizeof(分数)会为0?

4 个答案:

答案 0 :(得分:6)

函数内部的

sizeof(scores)等同于sizeof(double *):编译器无法判断数组的大小。

不会为零,但因为sizeof(scores)sizeof(double)都是整数类型的表达式,sizeof(scores)/sizeof(double)是整数除法,所以如果sizeof(scores) < sizeof(double) 1}},然后sizeof(scores)/sizeof(double) == 0.

答案 1 :(得分:3)

这是因为作为函数参数的数组被视为指针。例如,

double average (double scores[]);

......相当于:

double average (double *scores);

所以sizeof(scores)/sizeof(double)等于sizeof(double *)/sizeof(double),如果碰巧这些类型的大小相同,则结果为1,但如果double的大小为8和指针只有4,结果是0

答案 2 :(得分:1)

C中有关数组的两件事:

  1. 除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N” T的元素数组将被替换为(“衰减到”)类型为“T的指针”的表达式,其值是数组的第一个元素的地址。

    < / LI>
  2. 在函数参数声明的上下文中,T a[]T a[N]T *a相同; IOW,a被声明为指向T的指针,而不是数组。请注意,这仅适用于函数参数声明。

  3. 当您从主要功能调用average(scores)时,表达式scores将替换为double *类型的另一个表达式,因此average收到的是指针值,而不是数组。因此,获取元素数量的sizeof技巧在average函数中不起作用。您必须将scores中的元素数作为单独的参数传递,如下所示:

    double average(double *scores, size_t count)
    {
       ...
    }
    

    并将其命名为

    average(scores, sizeof scores / sizeof *scores); // or pass a constant 3, or
                                                     // something similar.
    

答案 3 :(得分:0)

scores是一个double * const,因此sizeof(scores)将是存储指针所需的大小