Массив Char объявляет проблемы - PullRequest
0 голосов
/ 08 ноября 2010

Почему я могу сделать

char identifier[4] = {'A', 'B', 'C', 'D'};

, а не

char identifier[4];
&identifier = {'A', 'B', 'C', 'D'}; // syntax error : '{'

?

И почему я могу сделать

char identifier[4] = "ABCD"; // ABCD\0, aren't that 5 characters??

, а не

char identifier[4];
&identifier = "ABCD"; // 'char (*)[4]' differs in levels of indirection from 'char [5]'

?

Это шутка ??

Ответы [ 3 ]

3 голосов
/ 08 ноября 2010

Вы можете инициализировать массив только тогда, когда объявите его.

Что касается char identifier[4] = "ABCD", это действительно возможно, но синтаксис используется для преднамеренного пропуска завершающего символа NUL.Выполните команду char identifier[] = "ABCD", чтобы компилятор подсчитал символы, и добавьте NUL ('\0').

2 голосов
/ 08 ноября 2010

Три точки:

  • Инициализация не назначение

  • Массивы не относятся к первоклассным типам, поэтому их нельзяназначены.Вы должны назначить элементы индивидуально (или использовать функцию, такую ​​как strcpy () или memcpy ().

  • Адрес массива предоставляется именем массива самостоятельно.

В последнем примере следующее является допустимым решением:

char identifier[4];
memcpy(identifier, "ABCD", sizeof(identifier) ) ;

Вы не можете использовать здесь strcpy (), потому что для этого потребуется массив из 5 символов дляпозвольте для нулевого терминатора. Сообщение об ошибках об уровнях косвенности не "шутка", это ваша ошибка; примечание в приведенном выше коде identifier не имеет оператора &, так какchar**, где требуется char*.

2 голосов
/ 08 ноября 2010

То, что сказал Арку, но вы также не можете назначить адрес чего-либо, то есть &x = ... никогда не является законным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...