C 为什么调用此函数时添加括号会破坏我的程序?

C 为什么调用此函数时添加括号会破坏我的程序?,c,C,我在这里的目的是制作一个简单的程序,输出数组中两个连续元素之间的最大差值,我的问题是,为什么在标记行中添加“[]”会中断程序(如果我将它们取出,效果很好) #包括 #包括 #定义ε0.000001 #定义尺寸5 双maxDif(双向量[]); int main(){ 双向量[DIM]={3,5,7,23,0}; 双重结果; 结果=maxDif(vec[]);/*ε) while(fabs(向量[i++]>EPSILON)) if((向量[i]-向量[i-1]>retVal)) retVal=向量

我在这里的目的是制作一个简单的程序,输出数组中两个连续元素之间的最大差值,我的问题是,为什么在标记行中添加“[]”会中断程序(如果我将它们取出,效果很好)

#包括
#包括
#定义ε0.000001
#定义尺寸5
双maxDif(双向量[]);
int
main(){
双向量[DIM]={3,5,7,23,0};
双重结果;
结果=maxDif(vec[]);/*ε)
while(fabs(向量[i++]>EPSILON))
if((向量[i]-向量[i-1]>retVal))
retVal=向量[i]-向量[i-1];
返回返回;
}
执行
maxDif(vec)
时,将数组(或更具体地说,指向数组第一个元素的指针)传递到函数
maxDif
。此函数的定义与此调用匹配


调用类似于
maxDif(vec[])
的函数是无效语法。空大括号对仅在声明数组时有效(如果它不是函数参数,或者如果它是
结构中的最后一个字段,也要初始化它),而在访问它时无效。

这不是需要将
vec
作为参数发送的方式。像这样发送:
**result=maxDif(vec)


说明:
vec
是一个数组,当您将它作为参数传递时,您将传递它的地址。编译器已经知道它是一个数组,因此不需要
[]
,而且-正如您所了解的那样,它们是无效语法,因为这不是表达式中使用的数组。它“中断”的原因与任何其他语法冲突中断代码的原因相同。这只是语法错误。使用不带任何索引的下标运算符。标准中没有这样定义它(参数定义中的方括号不算作下标运算符的使用),但只有在同一步骤中初始化时才可以。或者如果它被用作
结构的最后一个成员
“编译器已经知道它是数组…”不相关,因为函数的参数是指针。传递给它的是一个指针,恰好指向数组的第一个元素。@juanchopanza如果我错了,请纠正我,但据我所知,发送数组就是发送它的地址,这基本上就是向第一个元素发送指针。但是,当以这种方式发送时(vec被声明为数组),编译器知道为数组分配了多少空间,因此编译器知道它是一个数组-它知道它拥有多少空间编译器可能知道在
main()
中为数组分配了多少空间,但是在
maxDif
函数中只有一个指针。有关数组长度的所有信息都列在该函数中。
#include <stdio.h>
#include <math.h>
#define EPSILON 0.000001
#define DIM     5

double maxDif(double vector[]);

int
main(){
    double vec[DIM]={3,5,7,23,0};
    double result;
    result=maxDif(vec[]);  /* <-- problem here */
    printf("The largest diff between 2 consecutive elements is: %g \n", result);
    return 0;
}

double
maxDif(double vector[]){
    double retVal=0;
    int i=0;
    if(fabs(vector[0]>EPSILON))
        while(fabs(vector[i++]>EPSILON))
            if((vector[i]-vector[i-1]>retVal))
                retVal=vector[i]-vector[i-1];
    return retVal;
}