Чтобы понять эту ошибку или проблему, вы должны сначала знать разницу между указателем и массивом.
так вот, во-первых, я должен объяснить вам различия ч / б их
строковый массив
char strarray[] = "hello";
В массиве памяти хранится в ячейках непрерывной памяти, сохраняемых как [h][e][l][l][o][\0] =>[]
, это ячейка памяти размером в 1 байт, и к этим ячейкам непрерывной памяти можно обращаться по имени с именем strarray здесь. Здесь здесь массив строк strarray
, содержащий все символы строки, инициализированные в нем. в этом случае здесь "hello"
так что мы можем легко изменить его содержимое памяти, получая доступ к каждому символу по его индексу
`strarray[0]='m'` it access character at index 0 which is 'h'in strarray
и его значение изменилось на 'm'
, поэтому значение strarray изменилось на "mello"
;
Следует отметить, что мы можем изменить содержимое массива строк, изменив символ за символом, но не можем инициализировать другую строку непосредственно к нему, как strarray="new string"
недопустимо
Указатель
Как мы все знаем, указатель указывает на область памяти в памяти,
неинициализированный указатель указывает на случайную ячейку памяти, а после инициализации указывает на определенную ячейку памяти
char *ptr = "hello";
здесь указатель ptr инициализируется в строку "hello"
, которая является константной строкой, хранящейся в постоянном запоминающем устройстве (ПЗУ), поэтому "hello"
нельзя изменить, поскольку она хранится в ПЗУ
и ptr хранятся в секции стека и указывают на постоянную строку "hello"
, поэтому ptr [0] = 'm' недопустимо, поскольку вы не можете получить доступ только для чтения памяти
Но ptr может быть инициализирован непосредственно к другому строковому значению, поскольку это просто указатель, поэтому он может указывать на любой адрес памяти переменной своего типа данных
ptr="new string"; is valid