是否可以通过 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
我的问题需要一些解释:
首先,让我们考虑一个大小为 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