Указатель - это абстракция, которая позволяет ссылаться на данные в памяти так, чтобы к необработанной памяти обращались как к элементарной единице, чтобы гарантировать ее правильную интерпретацию для выбранного типа.
Сам указатель представлен собственным машинным размером слова. В вашем примере у вас есть два указателя на разные типы, но они по-прежнему являются указателями на адреса в памяти, и поэтому они имеют одинаковый размер. Как упоминалось в других ответах, для получения размера типа данных, на который указывает указатель, необходимо разыменовать его в операции sizeof, например SizeOf (* р).
Оператор ++ позволяет получить указатель, который ссылается на следующий адрес в памяти для соответствующего типа. Если он просто увеличивает адрес на один байт для всех типов, вы можете получить адрес в памяти, который указывает на середину представления данных
например. для двух 4-байтовых целых чисел без знака, представляющих десятичные значения 1 и 4 278 190 080 соответственно, начиная с адреса 0x00 в памяти (обратите внимание, что этот адрес приведен только для иллюстрации и не представляет реальную систему, поскольку ОС зарезервирует их для своих собственных целей) 1007 *
address 0x00 0x01 0x02 0x03 | 0x04 0x05 0x06 0x07
data value (4 byte integer) 0x00 0x00 0x00 0x01 | 0xFF 0x00 0x00 0x00
Если указатель на целое число имеет ссылку на адрес 0x00, а оператор ++ просто увеличил адрес указателя на 1 байт, у вас будет указатель на адрес 0x01, который, если вы затем получите доступ к этому адресу (плюс последующие 3 байта) как целое число, вы получите целое число, которое представлено байтами данных 0x00 0x00 0x01 плюс значение адреса 0x04, которое в этом случае является значением 0xFF. Это привело бы к целому числу с десятичным значением 511, которое не представляет ни одно из 2 целых чисел, хранящихся в памяти.
Чтобы правильно получить доступ к следующему целому числу в памяти, оператор ++ должен увеличить байтовый адрес указателя на 4 байта.