Ответ 1
Выражение *src
относится к первому символу в строке, а не всей строке. Чтобы переназначить src
, чтобы указать на другую строку tgt
, используйте src = tgt;
.
Когда я объявляю char *
фиксированной строке и повторно использую указатель, чтобы указать на другую строку
/* initial declaration */
char *src = "abcdefghijklmnop";
.....
/* I get the "warning: assignment makes integer from pointer without a cast" */
*src ="anotherstring";
Я попытался переделать указатель, но не успел.
Выражение *src
относится к первому символу в строке, а не всей строке. Чтобы переназначить src
, чтобы указать на другую строку tgt
, используйте src = tgt;
.
Когда вы пишете оператор
*src = "anotherstring";
компилятор видит постоянную строку "abcdefghijklmnop"
как массив. Представьте, что вы написали следующий код:
char otherstring[14] = "anotherstring";
...
*src = otherstring;
Теперь, немного яснее, что происходит. Левая часть *src
относится к char
(поскольку src
имеет тип pointer-to-char
), тогда как правая часть otherstring
относится к указателю.
Это не строго запрещено, потому что вы можете захотеть сохранить адрес, на который указывает указатель. Однако в этом случае обычно используется явный листинг (что не слишком часто встречается в случае). Компилятор бросает красный флаг, потому что ваш код, скорее всего, не сделает то, что вы думаете.
Мне кажется, что вы пытаетесь присвоить строку. Строки в C не являются такими типами данных, как на С++, а вместо этого реализованы с массивами char
. Вы не можете напрямую назначать значения строке, как вы пытаетесь сделать. Вместо этого вам нужно использовать функции strncpy
и друзей из <string.h>
и использовать char
массивы вместо указателей char
. Если вы просто хотите, чтобы указатель указывал на другую статическую строку, затем отпустите *
.
Предупреждение исходит из того факта, что вы разыскиваете src
в задании. Выражение *src
имеет тип char
, который является интегральным типом. Выражение "anotherstring"
имеет тип char [14]
, который в этом конкретном контексте неявно преобразован в тип char *
, а его значение - адрес первого символа в массиве. Таким образом, вы завершаете попытку присвоить значение указателя целому типу, следовательно, предупреждение. Опустите *
с *src
, и он должен работать как ожидалось:
src = "anotherstring";
так как тип src
равен char *
.
Что сказал Иеремия, плюс компилятор выдает предупреждение, потому что производство:
*src ="anotherstring";
говорит: возьмите адрес "anotherstring" - "anotherstring" IS a char pointer - и сохраните этот указатель косвенным через src (* src=...) в первый char строки "abcdef..." Предупреждение может быть озадачивающим, потому что в вашем коде не упоминается ни одного целого числа: предупреждение кажется бессмысленным. Но, вне поля зрения за занавеской, это правило, что "int" и "char" являются синонимами с точки зрения хранения: оба занимают одинаковое количество бит. Компилятор не различает, когда он выдает предупреждение, которое вы храните в целое число. Который, BTW, отлично работает и легален, но, вероятно, не совсем то, что вы хотите в этом коде.
- pete