Разница между char a = “string”; char * p = “string”;
Возможные дубликаты:
В чем разница между char s [] и char * s в C?
В чем разница между char a[]="string";
и char *p="string";
?
- Как работает getchar ()?
- Является ли модификация строковых литералов неопределенным поведением в соответствии со стандартом C89?
- case switch: ошибка: метка case не сводится к целочисленной константе
- Может ли printf быть заменен автоматически помещается в программу C?
- Представление целых чисел в двухместных
- void main () {if (sizeof (int)> -1) printf ("true"); else printf ("false"); ;
- Передача многомерных массивов в качестве аргументов функции в C
- Виртуальные таблицы и макет памяти в нескольких виртуальных наследования
- Почему мы должны инициализировать переменную перед ее использованием?
- atoi - как определить разницу между нулем и ошибкой?
- Возrotation строки C из функции
- Левое смещение с отрицательным сдвигом
- Правильный способ передачи 2-мерного массива в функцию
Первый – это массив, другой – указатель.
Объявление массива « 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», извлекает здесь значение указателя, добавляет три к указателю и, наконец, извлекает символ, на который указывает. В приведенном выше примере оба параметра [3] и p [3] являются символом «l», но компилятор попадает туда по-другому.
Вы можете использовать поиск, есть тонны объяснений по этому вопросу в Интернете.
char a[]="string";
// a
– массив символов.
char *p="string";
// p
– строковый литерал со статическим распределением. Любая попытка изменить содержимое p
приводит к неопределенному поведению, поскольку строковые литералы хранятся в разделе памяти только для чтения.
Первое объявление объявляет массив, а второе – указатель.
Если вы заинтересованы в различии в каком-то конкретном аспекте, уточните свой вопрос.
Нет разницы. Если вы не хотите писать в массив, в этом случае весь мир взорвется, если вы попытаетесь использовать вторую форму. См. Здесь .
Одно отличие состоит в том, что sizeof (a) -1 будет заменен длиной строки во время компиляции. С помощью p вам нужно использовать strlen (p), чтобы получить длину во время выполнения. Также некоторые компиляторы не любят char * p = “string”, они хотят const char * p = “string”, и в этом случае память для “string” доступна только для чтения, но память для a не является. Даже если компилятор не требует объявления const, это неверная практика, чтобы изменить строку, на которую указывает p (т.е. * p = ‘a’). Указатель p можно изменить, чтобы указать на что-то другое. С массивом a новое значение должно быть скопировано в массив (если он подходит).