Я хочу знать, почему работают первые операторы и почему не второй в С++
char a[10]="iqbal"; // it works
a="iqbal"; // does not work
Я хочу знать, почему работают первые операторы и почему не второй в С++
char a[10]="iqbal"; // it works
a="iqbal"; // does not work
Строго говоря, массив не является указателем! И массив (базовый адрес массива) не может быть модифицируемым значением lvalue. т.е. он не может появиться с левой стороны оператора присваивания. При этом разлагаются в указатели только в определенных обстоятельствах. Прочтите этот SO post, чтобы узнать, когда массивы распадаются на указатели. Вот еще одна хорошая статья, которая объясняет различия между массивами и указателями
Также читайте о lvalues и rvalues здесь, чтобы вы получили представление о вещах, которые не могут появиться в LHS =
char a [10] = "iqbal";//работает
В этом случае внутренне происходит следующее:
a[0] = 'i';
a[1] = 'q';
.
.
a[5] = '\0';
Итак, все прекрасно, поскольку array[i]
является изменяемым значением l.
а = "Iqbal";//не работает
Внутренне это примерно эквивалентно
0x60000(Address of a, but is a simple number here ) = Address of "iqbal"
Это неправильно, поскольку мы не можем присвоить номер цифре.
Массив char a будет статическим и не может быть изменен, если вы его инициализируете так. В любом случае вы никогда не сможете присвоить символьную строку a = "iqbal" в c. Для этого вам нужно использовать strncpy или memcpy. В противном случае вы попытаетесь переписать указатель на строку, и это не то, что вы хотите.
Таким образом, правильный код будет делать что-то вроде:
char a[10];
strncpy(a, "iqbal", sizeof(a) - 1);
a[sizeof(a) - 1] = 0;
-1 - зарезервировать байт для завершающего нуля. Обратите внимание: вам нужно будет убедиться в том, что строка завершена нулем или нет. Плохое апи. Существует вызов strlcpy(), который делает это для вас, но он не включен в glibc.
Первая строка - это не оператор, а декларация с инициализацией. Вторая строка - оператор выражения с оператором присваивания.
Вы не можете назначать массивы в C.
Но вы можете инициализировать массив с элементами строкового литерала.
почему работают первые операторы и почему не второй в С++
Потому что это разные высказывания, почти полностью не связанные. Не путайте с тем, что оба они используют символ =
. В одном случае он представляет инициализацию объекта. В другом случае оператор присваивания.
Ваша первая строка является законной, поскольку законно инициализировать агрегаты, включая массивы символов.
Вторая строка не является законной, так как присвоить массив нецелесообразно.
Так как это С++, могу ли я предположить, что вы избегаете голых массивов? Для символьных строк используйте std::string
. Для других массивов используйте std::vector
. Если вы это сделаете, вы, например, будете:
std::string a = "iqbal"; // it works
a="iqbal"; // so does this
При написании char a [10] = "iqbal" Вы инициализируете элементы массива символов a символами. Мы можем сделать то же самое с типом int (обратите внимание, что тип char получает немного другое лечение): int a [10] = {1,2,...};
Но запись следующего после части объявления будет недействительной, поскольку a будет обрабатываться точно так же, как указатель. Так что пишу что-то вроде а = {1,2,...}; или a = "iqbal" не будет никакого смысла!
попробовать:
char a[10]="iqbal";
char *my_a = a;
и работать с my_a.