Существует неявное преобразование от char*
(тип "5"
после его распадов) до int*
.
Это как можно ближе к C, чтобы сказать, что что-то незаконно.
На практике, компиляторы, которые принимают это заявление, скорее всего, относиться к нему как эквивалент:
int *x = (int*)"5";
т.е. они будут вставлять преобразование. (Это не единственная возможная интерпретация, но большинство компиляторов либо интерпретирует ее так, либо отклонит ее.) Это принимает значение char*
, которое является результатом распада выражения массива "5"
(то есть, адрес символа '5'
на начало строки) и преобразуется в int*
.
В результате указатель int*
указывает на объект int
, который может быть или недействителен. Строка "5"
имеет длину 2 байта ({ '5', '\0' }
). Если int
- это два байта, то *x
может оценивать результат интерпретации этих двух байтов как значение int
, что будет зависеть от его сущности. Или, если строковый литерал неправильно выровнен для объекта int
, оценка *x
может привести к прекращению вашей программы.И если int
шире, чем два байта (как это обычно бывает), *x
относится к памяти за конец строкового литерала. В любом случае попытка изменить *x
имеет еще один вид неопределенного поведения, поскольку попытка изменить строковый литерал явно не определена.
При составлении этой декларации вы должны получить хотя бы предупреждение. Если это так, вы определенно не должны были его игнорировать. Если вы не получили предупреждение, вы должны узнать, как уговорить ваш компилятор для получения дополнительных предупреждений.
TL; DR: Не делайте этого.
'int * x =" 5 "' объявляет 'x' как указатель на целое число, которое находится в начале строки' '5" '. Когда вы его пишете, он, вероятно, печатает символ «5», нулевой символ и любые последующие два байта, предполагая 'sizeof (int) = 4' на вашей платформе. –
@ AdamLiss no, он сказал «5» не 5. –
@SethCarnegie Нет, он сказал '5', а затем отредактировал свой вопрос, чтобы сказать« 5 », а затем я обновил свой комментарий. :-) –