Первое объявление объявляет массив, второе - указатель.
Если вас интересует различие в каком-то конкретном аспекте, уточните, пожалуйста, ваш вопрос.
Одно отличие состоит в том, что sizeof (a) -1 будет заменено длиной строки во время компиляции. С p вам нужно использовать strlen (p), чтобы получить длину во время выполнения. Также некоторым компиляторам не нравится char * p = "string", они хотят const char * p = "string", и в этом случае память для "string" доступна только для чтения, а память для a - нет. Даже если компилятор не требует объявления const, это плохая практика - изменять строку, на которую указывает p (т.е. * p = 'a'). Указатель p можно изменить, чтобы он указывал на что-то еще. С массивом a новое значение должно быть скопировано в массив (если оно подходит).
Первый - массив, второй - указатель.
Объявление массива "char a[6];
" просит выделить место для шести символов, которые будут известны под именем "a.
" То есть существует место с именем "a
", в котором могут находиться шесть символов. Объявление указателя "char *p;
", с другой стороны, запрашивает место, которое содержит указатель. Указатель будет известен под именем "p,
" и может указывать на любой символ (или непрерывный массив символов) в любом месте.
Эти утверждения
char a[] = "hello";
char *p = "world";
приведут к структурам данных, которые можно представить следующим образом:
+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+
Важно понимать, что ссылка типа x[3] генерирует различный код в зависимости от того, является ли x массивом или указателем. Учитывая приведенные выше объявления, когда компилятор видит выражение a[3], он выдает код для начала в месте "a", перемещения на три символа мимо него и получения символа в этом месте. Когда он видит выражение p[3], он выдает код для начала в месте "p", получения там значения указателя, добавления трех к указателю и, наконец, получения символа, на который он указывает. В приведенном выше примере и a[3], и p[3] - это символ 'l', но компилятор добирается до него по-разному.
Вы можете воспользоваться поиском, в интернете есть масса объяснений на эту тему.
char a [] = "строка";
// a
- это массив символов.
char * p = "строка";
// p
- строковый литерал, имеющий статическое размещение. Любая попытка изменить содержимое p
приводит к неопределенному поведению, поскольку строковые литералы хранятся в разделе памяти, доступном только для чтения.
Никакой разницы. Если только вы не хотите действительно записывать в массив, в этом случае весь мир взорвется, если вы попытаетесь использовать вторую форму. См. здесь.