我的问题需要一些解释:
首先,让我们考虑一个大小为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++;
如果这对于1D阵列是可能的,那么它可以用于多维阵列吗?以及如何在C中实现它?
只要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