Ответ 1
Основное отличие - это просто синтаксис, который вы используете для доступа к вашему char.
Под "доступом" я имею в виду, действуйте на нем, используя различные операторы на этом языке, большинство или все из которых выполняют разные вещи при применении к char
по сравнению с массивом char
. Это делает звук таким, как будто x
и y
почти полностью различны. Если факт, что они оба "состоят из" одного char, но что char был представлен совсем другим способом.
Реализация может привести к другим различиям, например, он может выровнять и проложить структуру по-разному, в соответствии с которой вы используете. Но я сомневаюсь, что это будет.
Примером различий оператора является то, что a char можно присваивать, а массив не равен:
SomeStruct a;
a.x = 'a';
a.y[0] = 'a';
SomeStruct b;
b.x = a.x; // OK
b.y = a.y; // not OK
b.y[0] = a.y[0]; // OK
Но тот факт, что y
не присваивается, не останавливает SomeStruct
, который можно присваивать:
b = a; // OK
Все это независимо от типа, char
или нет. Объект типа и массив этого типа с размером 1 почти одинаковы с точки зрения того, что в памяти.
В стороне, есть контекст, в котором он имеет большое значение, которое вы "используете" из char
и char[1]
, и которое иногда помогает путать людей с мыслью, что массивы действительно являются указателями. Не ваш пример, а как параметр функции:
void foo(char c); // a function which takes a char as a parameter
void bar(char c[1]); // a function which takes a char* as a parameter
void baz(char c[12]); // also a function which takes a char* as a parameter
Цифры, указанные в объявлениях bar
и baz
, полностью игнорируются языком С++. По-видимому, кто-то в какой-то момент считал, что программистам будет полезно как форма документации, указывая, что функция baz
ожидает, что ее аргумент указателя указывает на первый элемент массива из 12 char.
В bar и baz c
никогда не имеет типа массива - он выглядит как тип массива, но это не так, это просто причудливый синтаксис специального случая с тем же значением, что и char *c
. Вот почему я помещал кавычки в "use" - вы вообще не используете char[1]
, он просто выглядит.