==> Будет ли назначен NULL-указатель на символьный указатель *a
?
Массивы не являются указателями.
Для лучшего понимания давайтесм. пример из стандарта C # 6.7.9p32 [выделение шахты]
ПРИМЕР 8 Объявление
char s[] = "abc", t[3] = "abc";
определяет '' plain '' объекты массива char s
и t
, элементы которых инициализируются символьными строковыми литералами.Это объявление идентично
char s[] = { 'a', 'b', 'c', '\0' },
t[] = { 'a', 'b', 'c' };
Содержимое массивов может быть изменено.С другой стороны, объявление
char *p = "abc";
определяет p
с указателем type '' char '' и инициализирует его, чтобы указывать на объект с массивом типа '' char'' длиной 4, элементы которого инициализируются литералом символьной строки.Если предпринята попытка использовать p
для изменения содержимого массива, поведение не определено.
Итак, этот оператор
char a[]="";
определяет char
массив объект a
, элементы которого инициализируются литералом символьной строки ""
.Обратите внимание, что ""
является строковым литералом, содержащим один символ '\0'
.
Вышеприведенный оператор эквивалентен
char a[] = {'\0'};
Если мы опускаем измерение, компилятор вычисляет его для нас на основе размераинициализатора (здесь это будет 1
, потому что инициализатор имеет только один символ '\0'
).Таким образом, утверждение такое же, как
char a[1] = {'\0'};