C中指针数组中的负索引

时间:2017-12-08 04:23:09

标签: c pointers

#include<stdio.h>
int main(){
  int a1[]={6,7,8,18,34,67};
  int a2[]={23,56,28,24};
  int a3[]={-12,27,-31};
  int *y[]={a1,a2,a3};
  int **a= y;

  printf("%d\n",a[0][2]);
  printf("%d\n",*a[2]);
  printf("%d\n",*(++a[0]));
  printf("%d\n",*(++a)[0]);
  printf("%d\n",a[-1][1]);
  return 0;
}

当我运行上面的代码输出是8,-12,7,23,8。但如果我将最后3行更改为

printf("%d\n",*(++a[2]));
printf("%d\n",*(++a)[1]);
printf("%d\n",a[-1][1]);

输出为8,-12,27,27,7。我无法理解上次的printf声明。如何计算[-1] [某事物]?根据我*(++a)[1]应该打印56而不是27!

2 个答案:

答案 0 :(得分:0)

指针和数组基本上是虚拟内存中的地址。在C中,可以将它们计算为新地址。由于编译器知道指针指向的内存大小(例如int *指向4个字节),指针+/- 1表示地址+/-大小(例如int的4个字节)。

运算符*表示获取存储在指定地址中的值。

这里的另一个技巧是运营商的优先事项。 []在++之前计算。

如果您理解我的意思,那么您的问题应该得到解决。

答案 1 :(得分:0)

  

根据我的*(++ a)[1]应该打印56而不是27!

++a递增a到下一个int *,因此在指向y [0]等于a1之后,它指向y [1]等于a2。然后[1]依次指定y [1](即i)之后的下一个int *。 e。 y [2]等于a3 + 1(由于前面的++a[2])。最后,*指定y [2]指向的int。 e。 a3 [1]等于27。