LINUX.ORG.RU

операции с указателями


0

0

В книгах по С описывают операции с указателями. Но я нигде не нашел явного запрета на операцию типа:

char *p;
int n;

...

if ((n - p) >= 0) {...}

т.е. вычитание указателя _из_ целого (компилятор ругается). Наоборот можно.

Как это можно объяснить - что такая операция логически необоснованна?

Спасибо.

anonymous

Указатель -- это уже адрес, любое дальнейшее вычисление адресов идет относительно указателя с помощью ptrdiff_t.

Поэтому логика действий такая:

> void *p1, *p2, *p3; ptrdiff_t n;


можно:
> n = p2 - p1;

> p2 = p1 + n = n + p1;


нельзя:
> p3 = p1 + p2;

> p2 = n - p1;


К примеру, середина между p1 и p2:
> p3 = p1 + (p2 - p1)/2;

Но никак не:
> p3 = (p1 + p2)/2;


То есть по сути указатели можно либо вычитать, результатом их вычитания является int-подобный тип ptrdiff_t, либо к указателю можно прибавлять целое число(положительное или отрицательное), результатом является указатель. Другой арифметики с ними нет.

balodja ★★★
()
Ответ на: комментарий от balodja

> А как же (ptr - ptr)?

Это разница двух адресов.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.