Присвоение значения массиву char

Я не получаю ошибки при вводе

char a[10] = "Hi";

Но когда я меняю его на следующее, я получаю сообщение об ошибке: Array type char is not assignable.

char a[10];
a = "Hi";

Почему тип массива char не присваивается? Это потому, что язык написан специально, или я не хватает точки?

Ответ 1

Способ С++ для этого, как я уже отмечал выше, будет использовать std::string вместо char[]. Это даст вам поведение назначения, которое вы ожидаете.

Тем не менее, причина, по которой вы получаете только ошибку во втором случае, состоит в том, что = в этих двух строках означает разные вещи:

char a[10] = "Hi";
a = "Hi";

Первая - это инициализация, вторая - назначение.

Первая строка выделяет достаточно места в стеке для хранения 10 символов и инициализирует первые три из этих символов как "H", "i" и "\ 0". С этого момента все a действительно ссылаются на позицию массива в стеке. Поскольку массив - это просто место в стеке, a никогда не разрешается изменять. Если вы хотите, чтобы другое место в стеке имело другое значение, вам нужна другая переменная.

Вторая (недействительная) строка, с другой стороны, пытается изменить a, чтобы ссылаться на (технически другое) заклинание "Hi". Это не допускается по причинам, указанным выше. Когда у вас есть инициализированный массив, единственное, что вы можете с ним сделать, это считывать значения из него и записывать в него значения. Вы не можете изменить его местоположение или размер. Это то, что задание будет пытаться сделать в этом случае.

Ответ 2

Массив не является изменяемым lvalue

использовать

char a[10];
strcpy(a, "Hi");

Ответ 3

Язык не позволяет назначать строковые литералы массивам символов. Вместо этого следует использовать strcpy():

strcpy(a, "Hi");

Ответ 4

a - указатель на массив, а не сам массив. Его нельзя переназначить.

Вы отметили С++ BTW. В этом случае лучше использовать std::string. Вероятно, это больше того, чего вы ожидаете.

Ответ 5

Простой,

char a[10] = "Hi";

- небольшая "дополнительная функция", так как это невозможно сделать во время выполнения.

Но это причина для стандартных библиотек C/С++.

#include <string.h>

// ...
strcpy(a,"Test"); // STR-ing C-o-PY.

Это происходит из стандартной библиотеки C. Если вы используете С++, вы должны использовать std::string, если вы действительно не хотите сосать всю возможную производительность с вашего ПК назначения.

Ответ 6

это потому, что инициализация не является назначением. первое, что работает, это инициализация, а вторая, которая не работает, как и ожидалось, - это назначение. вы просто не можете присваивать значения массивам, которые вы должны использовать sth, как strcpy или memcpy. или вы можете в качестве альтернативы использовать std::copy из <algorithm>

Ответ 7

Это так просто, (=) имеют два разных среднего назначения и инициализации. Вы также можете написать свой код

         #include <iostream>

         using namespace std;

          int main ()
         {
             char message[3] = {'H', 'i', '\0'};

                cout << message<< endl;

           return 0;

           } 

в этом коде вам не нужно писать сложный код или функцию и даже не нужно string.h