Разница между char a = “string”; char * p = “string”;

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

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

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

Объявление массива « 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 новое значение должно быть скопировано в массив (если он подходит).

  • Ошибка сегментации, восстанавливающая строковый литерал
  • Есть ли функция для округления поплавка на C или мне нужно написать собственное?
  • Строки в C, как получить subString
  • n & (n-1), что делает это выражение?
  • C # Cast Весь массив?
  • Целочисленное переполнение и неопределенное поведение
  • Почему ++ i ++ дает «L-значение требуемой ошибки» в C?
  • Почему мой оператор мощности (^) не работает?
  • Как преобразование float / double в int обрабатывается в printf?
  • C - передача массива 2d в качестве аргумента функции?
  • Разделить строку на C в каждом пробеле
  • Interesting Posts

    Xcode 4 – ошибка «Недействительность подлинного подписи не найдена» при настройке профилей при установке нового Macintosh

    Получить имя classа объекта как строку в Swift

    Невозможно использовать запрос LIKE в JDBC PreparedStatement?

    Как использовать OpenSSL для шифрования / дешифрования файлов?

    Каковы преимущества двухъядерного процессора в четырехъядерном процессоре на настольном ПК?

    Мое приложение «содержит шифрование»?

    Разница между длинными и внутренними типами данных

    Эстетически редактирование grub.cfg

    Как я могу получить доступ к опции «Открыть команду здесь здесь» в Windows без переноса?

    Firebase: как сгенерировать уникальный цифровой идентификатор для ключа?

    Как я могу удаленно войти на свой компьютер с ОС Windows с помощью Mac?

    Модуль тестирования сервлетов Java

    Windows Upgrade vs Full Install

    Может ли работодатель отслеживать использование IP-адресов на домашних компьютерах через VPN?

    Доступ к диалоговому окну загрузки файлов в Firefox

    Давайте будем гением компьютера.