下标值的错误既不是数组也不是指针也不是向量

时间:2018-03-11 13:57:01

标签: c compiler-errors

我读到了与此错误相关的其他答案,但我的问题不是如何解决它。相反,这就是为什么下面两个片段存在差异

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行:订阅值为   既不是数组也不是指针也不是矢量

2 个答案:

答案 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]);