Если ваша переменная имеет тип указателя, то каждое вычисление указателя выполняется путем умножения размера типа указателя.
Например:
//Lets assume char is 1 byte, int is 4 bytes long.
// sizeof(*cp) = 4, sizeof(*ip) = 4;
char *cp = (char *)10; //Char itself is 1 byte
int *ip = (int *)10;
cp++; //Increase pointer, let us point to the next char location
ip++; //Increase pointer, let us point to the next int location
printf("Char: %p\r\n", (void *)cp); //Prints 11
printf("Int: %p\r\n", (void *)ip); //Prints 14
В первом случае печатается 11
, а во втором - 14
. Это потому, что следующий элемент char идет на 1 байт дальше, а следующий элемент int — на 4 байта вперед.
Если у вас есть 2 указателя одного типа (например, int *
, как у вас), то, если один указывает на 14
, а другой на 10
, между ними находится память 1
int, вычитание дает вам 1
.
Если вы хотите получить результат 4
, перед вычислением приведите указатели к char *
, потому что sizeof(char)
всегда равно 1
, что означает, что у вас есть 4
элементов между адресуемыми 10
и 14
, и вы получите результат 4
.
Надеюсь, поможет.
person
tilz0R
schedule
12.06.2017
int r = (int)((char *)p - (char *)k)
. Сообщите нам о результате. Позже мы обсудим результат. - person tilz0R   schedule 12.06.2017%d
ожидает параметрint
, вы передаете указатели иptrdiff_t
. И указатели на разные разные массивы (один объект рассматривается как массив из 1 элемента) не могут быть вычтены (соответственно, разница не имеет смысла). Вы должны прочитать указатели на бой в хорошей книге C. Как вы думаете, что должна дать сумма двух указателей? - person too honest for this site   schedule 12.06.2017