Потому что указатель не является ссылкой;).Это не значение, это просто адрес в памяти.Когда вы проверяете значение указателя, оно будет числом, возможно большим, не связанным с фактическим значением, которое хранится в этой позиции памяти.Скажем, printf("%p\n", a);
печатает «2000000» - это означает, что ваш указатель указывает на 2000000-й байт в памяти вашего устройства.Он практически не знает, какое значение там хранится.
Теперь указатель знает, на какой тип он указывает.Целое число в вашем случае.Поскольку целое число имеет длину 4 байта, когда вы хотите перейти к следующей «ячейке», на которую указывает указатель, оно должно быть 2000004. Это на целое число дальше, поэтому a++
имеет смысл.Кстати, если вы хотите получить 42
(из вашего примера), распечатайте значение, указанное в: printf("%d\n", *a);
Надеюсь, это имеет смысл;)