Можно ли пройти массив с указателем на известную позицию в C? - PullRequest
0 голосов
/ 10 марта 2019

Мой вопрос требует пояснения:

Сначала давайте рассмотрим одномерный массив размером n (динамический или статический). Давайте назовем это вкладкой.

Упростим, если массив хранится в памяти с адреса от 0x01 до (0x01 + n - 1).

Теперь рассмотрим указатель с именем p. И начальный индекс i, между 0 и n - 1.

Затем мы делаем это:

p = &tab[i];

p знает значение адреса 0x0i. (Обозначения не верны, но вы поняли смысл).

Можем ли мы прочитать tab [i - 1] или tab [i + 1] , используя p, как это?

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

Или просто так?

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

И в конечном итоге делать это?

p--;
p++;

А если это возможно для одномерных массивов, может ли это быть для многомерных массивов? И как реализовать это в C?

1 Ответ

1 голос
/ 10 марта 2019

До тех пор, пока 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
...