Указателя является абстракцией, которая позволяет ссылаться на данные в памяти, так что сырьевая память доступна как атомная единица, чтобы убедиться, что он интерпретируется соответствующим образом для данного типа выбран.
Указатель сам по себе представляет собой размер машинного слова. В вашем примере у вас есть два указателя на разные типы, но они все еще являются указателями на адреса в памяти, и поэтому они одинакового размера. Как упоминалось в других ответах, чтобы получить размер типа данных, на который указывает указатель, вы должны разыменовать его в операции sizeof, например. SizeOf (* р).
Оператор ++ позволяет получить указатель, который ссылается на следующий адрес в памяти для соответствующего типа. Если он просто увеличил адрес на один байт для всех типов, вы могли бы получить адрес в памяти, который указывает на середину представления данных.
, например.для двух беззнаковых 4-байтовых целых чисел, представляющих десятичные значения 1 и 4 278 190 080 соответственно, начиная с адреса 0x00 в памяти (обратите внимание, что адрес здесь просто для иллюстрации и не представляет реальной системы, так как ОС резервирует их для своих целей)
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, которое не представляет ни одно из двух целых чисел, хранящихся в памяти.
Для правильного доступа к следующему целому числу в памяти оператор ++ должен увеличивать байтовый адрес указателя на 4 байта.
Если вы хотите узнать «размер шага» указателя, вы хотите сделать sizeof (* p), а не sizeof (p). –
Ну, собственно, в моем ответе я рассказал вам всю концепцию, стоящую за ней, и вы приняли самый основной ответ ... xD – Cipi
Шар занимает 1 байт в памяти, поэтому ptrchar ++ будет перемещать 1 память вперед. а целое число занимает 4 байта в памяти. поэтому следующий ptrinteger ++ будет перемещать 4 байта. Аналогично, скажем, float занимает 8 байтов, поэтому floatptr ++ wil перемещает float ptr в 8 байтов. – samprat