繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM