[英]Error on subscripted value is neither array nor pointer nor vector
我读了其他与此错误也很相关的答案,但我的问题不是如何解决它。 而是这就是为什么下面两个片段之间存在差异
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行:下标值既不是数组,也不是指针,也不是向量
问题的症结在于变量名。 请允许我从第一个功能中删除所有不相关的内容:
void function(int a[]){
int a = /* whatever */;
a[0];
}
您使用相同的标识符( a
)引用了两件事。 在C和C ++中,规则都规定以后的声明将隐藏前一个声明。 因此,整数从声明它的那一刻起就隐藏了指针(记得“数组”已调整为函数参数列表中的指针),并且您失去了引用指针参数的能力。
这就是a[i]
是无效表达式的原因,因为它尝试下标的a
不再是数组或指针。
错误在这里:
int a = abs(x-a[j]);
在此行之前,使用类型int []
定义a
。 但是在这一行,您将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]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.