0

我的问题需要一些解释:

首先,让我们考虑一个大小为 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 中实现它?

4

1 回答 1

1

只要p + i(对于任何 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
于 2019-03-10T07:33:20.177 回答