Различие между символом [] = “строка”; символ *p = “строка”; [дубликат]

12
задан Community 23 May 2017 в 12:33
поделиться

5 ответов

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

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

2
ответ дан 2 December 2019 в 03:38
поделиться

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

1
ответ дан 2 December 2019 в 03:38
поделиться

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

Объявление массива "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', но компилятор добирается до него по-разному.

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

27
ответ дан 2 December 2019 в 03:38
поделиться

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

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

9
ответ дан 2 December 2019 в 03:38
поделиться

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

2
ответ дан 2 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: