Подтвердить что ты не робот

Присвоение строки символов массиву char

Я хочу знать, почему работают первые операторы и почему не второй в С++

char a[10]="iqbal";  // it works

a="iqbal"; // does not work 
4b9b3361

Ответ 1

Строго говоря, массив не является указателем! И массив (базовый адрес массива) не может быть модифицируемым значением 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"

Это неправильно, поскольку мы не можем присвоить номер цифре.

Ответ 2

Массив char a будет статическим и не может быть изменен, если вы его инициализируете так. В любом случае вы никогда не сможете присвоить символьную строку a = "iqbal" в c. Для этого вам нужно использовать strncpy или memcpy. В противном случае вы попытаетесь переписать указатель на строку, и это не то, что вы хотите.

Таким образом, правильный код будет делать что-то вроде:

char a[10];
strncpy(a, "iqbal", sizeof(a) - 1);
a[sizeof(a) - 1] = 0;

-1 - зарезервировать байт для завершающего нуля. Обратите внимание: вам нужно будет убедиться в том, что строка завершена нулем или нет. Плохое апи. Существует вызов strlcpy(), который делает это для вас, но он не включен в glibc.

Ответ 3

Первая строка - это не оператор, а декларация с инициализацией. Вторая строка - оператор выражения с оператором присваивания.

Вы не можете назначать массивы в C.

Но вы можете инициализировать массив с элементами строкового литерала.

Ответ 4

почему работают первые операторы и почему не второй в С++

Потому что это разные высказывания, почти полностью не связанные. Не путайте с тем, что оба они используют символ =. В одном случае он представляет инициализацию объекта. В другом случае оператор присваивания.

Ваша первая строка является законной, поскольку законно инициализировать агрегаты, включая массивы символов.

Вторая строка не является законной, так как присвоить массив нецелесообразно.

Так как это С++, могу ли я предположить, что вы избегаете голых массивов? Для символьных строк используйте std::string. Для других массивов используйте std::vector. Если вы это сделаете, вы, например, будете:

std::string a = "iqbal";  // it works
a="iqbal"; // so does this

Ответ 5

При написании char a [10] = "iqbal" Вы инициализируете элементы массива символов a символами. Мы можем сделать то же самое с типом int (обратите внимание, что тип char получает немного другое лечение): int a [10] = {1,2,...};

Но запись следующего после части объявления будет недействительной, поскольку a будет обрабатываться точно так же, как указатель. Так что пишу что-то вроде а = {1,2,...}; или a = "iqbal" не будет никакого смысла!

Ответ 6

попробовать:

char a[10]="iqbal";
char *my_a = a;

и работать с my_a.