是否可以通过 C 中已知位置上的指针遍历数组?

Is it possible to go through an array with a pointer on a known position in C?

我的问题需要一些解释:

首先,让我们考虑一个大小为 n 的一维数组(动态或静态)。我们称它为选项卡。

我们将通过假设数组存储在内存中从地址 0x01 到 (0x01 + n - 1) 来简化。

现在考虑一个名为 p 的指针。起始索引 i,介于 0 和 n - 1 之间。

然后我们这样做:

p = &tab[i];

p 已经知道地址 0x0i 的值。 (符号不正确,但你明白了)。

我们可以像这样使用 p 读取 tab[i - 1]tab[i + 1] 吗?

int iprev = *(p - 1);
int inext = *(p + 1);

或者只是像这样?

int iprev = p[-1];
int inext = p[1];

最终会这样做吗?

p--;
p++;

如果一维数组可以,那么多维数组也可以吗?以及如何在 C 中实现它?

只要p + i(对于any i,正数或负数)在任何方向上都没有越界(即,它在你的例子中没有指向 tab[0] 之前或 tab[n - 1] 之后)那么没关系。

并且记住对于任何指针或数组p和索引i,表达式*(p + i)正好是 等于 p[i].


更准确地说,指针可以指向任何地方,只要在取消引用指针时指向有效内存即可。

示例:

int tab[N];  // Exact value of N is irrelevant
int *p = tab;  // Equal to p = &tab[0]

p--;  // After this, p will be pointing out of bounds, this is okay

// Comparing pointers is okay
if (p < tab)
{
    /* ... */
}

printf("Value of *p = %d\n", *p);  // ERROR: Here you dereference the ouf-of-bounds pointer