Вы имеете дело с разницей между массивом, указателем и скалярной семантикой.
За исключением случаев, когда это операнд операторов sizeof
или унарных &
или строковый литерал, используемый дляинициализировать массив символов в объявлении, выражение типа "массив N-элементов из T
" будет преобразовано ("затухание") в выражение типа "указатель на T
", изначением выражения будет адрес первого элемента массива.
Строковый литерал "1"
представляет собой массив выражение типа char [2]
.В этом контексте он «затухает» до выражения типа char *
, а значением выражения является адрес первого символа строки.Итак, вы присваиваете лайк:
a = "l"; // char * = char *
Этого не происходит с целочисленным вариантом.Литерал 1
имеет тип int
, но вы пытаетесь присвоить это значение int
объекту int *
:
a = 1; // int * = int
, который должен вызвать диагностику.Вы можете назначить int *
значение только для объекта int *
- вам нужно явно привести 1
:
a = (int *) 1;
, который подавит диагностику, но 1
весьма вероятно не действительный адрес памяти на вашей платформе, и попытка его использования вызовет проблемы.