Основным отличием является только синтаксис, который вы используете для доступа к вашему одному символу.
Под «доступом» я имею в виду, действуя по нему, используя различные операторы в языке, большинство или все из которых выполняют разные действияпри применении к char
по сравнению с массивом char
.Это звучит так, как будто x
и y
почти полностью отличаются.Если факт, что они оба «состоят» из одного символа, но этот символ был представлен совсем по-другому.
Реализация может вызвать другие различия, например, это может выровнятьи добавьте структуру по-разному, в зависимости от того, какой вы используете.Но я сомневаюсь, что так и будет.
Пример различий в операторах заключается в том, что символ можно назначить, а массив - нет:
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
isn 't назначаемый не останавливает 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
, полностью игнорируются языком C ++.Очевидно, кто-то в какой-то момент почувствовал, что это было бы полезно для программистов как форма документации, указывающая, что функция baz
ожидает, что ее аргумент-указатель укажет на первый элемент массива из 12 символов.
В барах и базах c
никогда не имеет типа массива - это похоже на тип массива, но это не так, это просто причудливый синтаксис особого случая с тем же значением, что и char *c
.Вот почему я поставил кавычки на «использование» - вы на самом деле не используете char[1]
, просто это выглядит так.