На экзамене по программированию (язык Си) был такой вопрос
"Если c – массив char, то чему равна разность (с+3) - с (в байтах)?".
Правильный ответ 3.
Объясните, пожалуйста, как получается 3?
Когда ты вычитаешь указатели, результат это количество элементов указанного типа между этими указателями. В твоём случае 3 char, видимо, предполагается, что sizeof(char) == 1. В общем случае это не так, правильный ответ будет 3*sizeof(char).
Дополню:
Когда указатель складывается/вычитается с целым числом (c+3), то и в этом случае заданное целое число является количеством элементов указанного типа. Т.е. по факту, если считать в байтах будет (c + sizeof(*c) * 3).
Для компилятора любой указатель (кроме void*) - это адрес первого (нулевого) элемента массива указанного типа, поэтому адресная арифметика является на самом деле "арифметикой массивов", если так можно выразиться. Все арифметические действия с указателями производятся на самом деле не в байтах, а в элементах массива, на который указывает указатель.
Почему указатель на void является исключением уже должно быть понятно - потому что void - это не известно какой тип и размер этого типа компилятор вычислить не может, поэтому адресная арифметика не поддерживается для void*.