具有相同指针的指针算法(数组下标不是整数)

时间:2013-08-08 19:17:22

标签: c gcc clang c99

我只是想确保我对这里发生的事情的解释是正确的。请考虑以下代码片段,这些代码段在32位环境中编译并在堆栈中声明。

// Declares an array of integers with a length of 10.
int arr[ 10 ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

// Performs some pointer arithmetic.
int result = arr[ arr + 2 ];

现在我知道在C中使用方括号只是以下的别名。

*( ... )

因此,在该别名后,该代码段将转换为以下内容。

int result = *( arr + arr + 2 );

现在,我的解释是指针算术将计算为arr加2的地址乘以整数的大小加上arr的地址。因此,我的结论是arr将指向我没有分配的内存。这将导致结果成为一些垃圾值。

然而,当我用clang和gcc编译时,我收到一个错误,说“数组下标不是整数”。为什么会出现这种情况?我的解释在哪里出错?

2 个答案:

答案 0 :(得分:8)

数组下标不是整数。

指针算法仅限于:

  • 指针 - 指针(产生一个整数)
  • 指针+整数(产生指针)
  • 指针 - 整数(产生指针)。

你不能添加两个指针值,只是因为结果没有合理的含义。

您期望arr[ arr + 2 ]做什么?更新:我看到你解决了这个问题;你希望它引用一些垃圾地址。这种语言会阻止您生成垃圾。不要指望它在所有情况下都这样做。

答案 1 :(得分:0)

除了一个字母,你的代码应该工作!! []中的值必须是整数,因此取消引用arr + 2:

// Declares an array of integers with a length of 10.
int arr[ 10 ] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

// Performs some pointer arithmetic.
int result = arr[ *(arr + 2) ];

这应该产生result = arr [2];因此结果= 2

我在Eclipse / Microsoft C编译器上运行它并得到了完全相同的结果。

最后,在K& R中讨论了arr + 2的惯例,你试图做的事情完全没有错。

只是为了好玩,试试:int result = *(arr + *(arr + 2));