仅使用指向一个元素的指针访问数组元素的上一个和下一个成员

dbu*_*ush 1 c arrays pointers

(改编自这个删除的问题.)

假设我们有一个数组,int a[n]并且我们有一个指向数组中间元素的指针(即int *p = &a[y]0 <y <n-1).

如果p传递给我们无法直接访问数组的函数,如何在给定数组元素之前和之后立即访问这些元素,以便将它们一起添加?

例如,如果a在范围内,总和可以像这样容易得到:

int sum = a[y-1] + a[y+1];
Run Code Online (Sandbox Code Playgroud)

但是在a不在范围内的函数中:

int sum_prev_next(int *p)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

这样称呼:

sum = sum_prev_next(&a[y]);
Run Code Online (Sandbox Code Playgroud)

该函数如何访问上一个和下一个元素以返回总和?

dbu*_*ush 5

假设有问题的指针没有指向数组的第一个或最后一个元素,您可以使用指针算法来访问数组的前一个和下一个元素.

int sum_prev_next(int *p)
{
   return *(p-1) + *(p+1);
}
Run Code Online (Sandbox Code Playgroud)

或等效地:

int sum_prev_next(int *p)
{
   return p[-1] + p[1];
}
Run Code Online (Sandbox Code Playgroud)

负数组下标可能不常见,但在这种情况下可以很好地定义.这可以用图表更好地解释:

        p-1
        |   p   p+1
        |   |   |
        v   v   v
  -------------------------
a | 0 | 1 | 2 | 3 | 4 | 5 |
  -------------------------
Run Code Online (Sandbox Code Playgroud)

如果p指向a[2],则p[-1]与之相同a[1]并且p[1]相同a[3].

重要的是要注意,此函数的前提条件是p不指向数组的第一个或最后一个元素.如果有,那么上获取p[-1]p[1]将调用未定义行为由阵列开始前或者创建一个指向一个或提领的指针,一个过去的数组的末尾(创建一个指向一个过去到底是OK) .