c - C 指针数组中的负索引

标签 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 语句。 a[-1][something] 是如何计算的?根据我的说法, *(++a)[1] 应该打印 56 而不是 27 !

最佳答案

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

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

这里的另一个技巧是运算符的优先级。 []在++之前计算。

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

关于c - C 指针数组中的负索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47707689/

相关文章:

无法从 C 中的函数返回结构

c - 无法从结构中的二维数组打印字符串?

c - bsearch 和结构(自定义类型)

c - 如何访问 C 中结构中索引处的元素?

c++ - 将内存池中的malloc和free替换为new和delete

c++ - C/C++ 中的指针及其内存空间

c - 简单的C scanf 行不通?

c - 高效计算 nCk mod p

c - futex 在这种情况下如何工作?

c - 使用 malloc 创建二维和一维数组时出错