В этом коде:
int * p = new int(44);
p выделяется в куче, и значение, на которое он указывает, равно 44;
но теперь я могу сделать что-то вроде этого:
p[1] = 33;
без получения ошибки. Я всегда думал
int * p = new int(44);
был просто еще один способ сказать, что «P выделяется в куче и указывает на адрес, содержащий 44», но, очевидно, это делает p указателем на массив целых чисел? размер этого нового массива 44? Или это необычный результат?
Вы были правы: P выделяется в куче и указывает на адрес, содержащий 44. Массив не выделен. p[1] = 33;
это то, что они называют «неопределенным поведением». Ваша программа может быть сбой, но он не гарантированно завершится каждый раз, когда вы делаете это.
int *p_scalar = new int(5); //allocates an integer, set to 5.
Если вы получаете доступ к p_scalar [n] (n <> 0) может произойти сбой
В вашем примере язык C ++ предоставляет реализацию по умолчанию для оператора подписки для указателей, который выглядит примерно так:
(*Ptr)& operator[](size_t index)
{
return *(address + index*sizeof(*Ptr));
}
Это всегда может быть перегружено и заменено для любого типа. Целые числа не являются исключением, когда вы говорите:
int * pointer = alocate_int_array();
pointer[1] = 1;
Вы используете дополненную компилятором реализацию по умолчанию этого оператора.