Подтвердить что ты не робот

Разница между char a [] = "string"; char * p = "string";

Возможные дубликаты:
В чем разница между char s [] и char * s в C?

В чем разница между char a[]="string"; и char *p="string";?

4b9b3361

Ответ 1

Первый - это массив, другой - указатель.

Объявление массива "char a[6];" требует, чтобы пространство для шести символов было отложено, чтобы быть известным под именем "a.". То есть есть место с именем "a", в котором шесть символов могут сидеть. Объявление указателя "char *p;", с другой стороны, запрашивает место, в котором содержится указатель. Указатель должен быть известен под именем "p," и может указывать на любой char (или непрерывный массив символов) где угодно.

Утверждения

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", извлекает здесь значение указателя, добавляет три к указателю и, наконец, извлекает символ, на который указывает. В приведенном выше примере оба параметра [3] и p [3] являются символом "l", но компилятор попадает туда по-другому.

Вы можете использовать поиск, есть тонны объяснений по этому вопросу в Интернете.

Ответ 2

char a[]="string";//a - это массив символов.

char *p="string";//p - строковый литерал со статическим распределением. Любая попытка изменить содержимое p приводит к Undefined Поведение, поскольку строковые литералы хранятся в разделе памяти только для чтения.

Ответ 3

Первое объявление объявляет массив, а второе - указатель.

Если вас интересует разница в каком-то конкретном аспекте, уточните свой вопрос.

Ответ 4

Никакой разницы. Если вы не хотите писать в массив, в этом случае весь мир взорвется, если вы попытаетесь использовать вторую форму. См. здесь.

Ответ 5

Одно отличие состоит в том, что sizeof (a) -1 будет заменен длиной строки во время компиляции. С помощью p вам нужно использовать strlen (p), чтобы получить длину во время выполнения. Также некоторые компиляторы не любят char * p = "string" , они хотят const char * p = "string" , и в этом случае память для "string" доступна только для чтения, но память для a не является. Даже если компилятор не требует объявления const, это неверная практика для изменения строки, на которую указывает p (т.е. * p = 'a'). Указатель p можно изменить, чтобы указать на что-то другое. С массивом a новое значение должно быть скопировано в массив (если оно подходит).