是否可以通过指针在C中的已知位置进行数组?

问题描述 投票:0回答:1

我的问题需要一些解释:

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

c arrays dynamic-memory-allocation memory-address static-memory-allocation
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
© www.soinside.com 2019 - 2024. All rights reserved.