我读到了与此错误相关的其他答案,但我的问题不是如何解决它。相反,这就是为什么下面两个片段存在差异
void sortArray(int a[],int n,int x){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int a = abs(x-a[j]);
int b = abs(x-a[j+1]);
if(a > b)
swap(&a[j],&a[j+1]);
}
}
}
其他代码段确实会产生错误。
void sortArray(int a[],int n,int x){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(abs(x-a[j]) > abs(x-a[j+1]))
swap(&a[j],&a[j+1]);
}
}
}
虽然上面没有。我想知道内部工作。
错误在第一行代码中为第4,5和7行:订阅值为 既不是数组也不是指针也不是矢量
答案 0 :(得分:4)
问题的关键是变量名称。请允许我删除与第一个函数无关的所有内容:
void function(int a[]){
int a = /* whatever */;
a[0];
}
您有两个由相同标识符引用的内容(a
)。在C和C ++中,规则规定后来的声明将隐藏先前的声明。所以整数从声明它的那一刻起隐藏指针(回想一下“数组”被调整为函数参数列表中的指针),你就失去了引用指针参数的能力。
这就是a[i]
是无效表达式的原因,因为它尝试下标的a
不再是数组或指针。
答案 1 :(得分:1)
错误在于:
int a = abs(x-a[j]);
在此行之前,a
的定义类型为int []
。但是,在此行中,您将a
重新定义为int
,屏蔽先前的定义。因此,表达式a[j]
指的是新声明的a
,它不是指针或数组。
将此变量的名称更改为其他名称:
int c = abs(x-a[j]);
int b = abs(x-a[j+1]);
if(c > b)
swap(&a[j],&a[j+1]);