Может кто-нибудь объяснить мне, в чем разница между:
char* name = "Gerardo";
либо
char name[] = "Gerardo";
Я хотел бы знать различия с точки зрения памяти или производительности.
Может кто-нибудь объяснить мне, в чем разница между:
char* name = "Gerardo";
либо
char name[] = "Gerardo";
Я хотел бы знать различия с точки зрения памяти или производительности.
Принципиальное отличие состоит в том, что в случае указателя он указывает на строковый литерал. Попытка изменить его является неопределенным поведением.
В то время как в другом случае массив содержит копию строки, которую можно изменить.
Тот факт, что строковый литерал нельзя модифицировать, позволяет компиляторам выполнять определенные оптимизации. Если строка повторяется в коде и используется как литерал, компилятор может использовать одну и ту же копию строки для всех применений, уменьшая использование памяти. Его также можно использовать напрямую, что быстрее.
Например, эта программа на C:
Скомпилированный ассемблерный код (оставив только нужные части):
Однако та же программа, использующая массивы:
При его составлении:
Для компиляции тех примеров, которые я использовал
gcc -c -S -O2 fichero.c
(версия 5.4.0)Заключение . Если вы не собираетесь изменять строку, альтернативный строковый литерал, назначенный указателю, быстрее и использует меньше памяти. Если вы собираетесь изменить строку, вы должны использовать массив.
Указатели на символы обычно используются для доступа к строкам символов, поскольку строки строятся на основе адреса (адреса первого символа) и маркера конца строки (символа '\0'). Объявление указателя на символ следует обычным правилам:
Указатели строк: определение, объявление и инициализация. Объявление строки может быть следующим:
Это резервирует место для строки символов LENGTH.
В C имя одномерного списка равно адресу первого элемента в списке. Когда для строки доступно зарезервированное пространство, указатель на строку может быть создан с помощью следующих операторов:
Ссылка
http://maxus.fis.usal.es/fichas_c.web/07xx_PAGS/0702.html
Указатели на char обращаются к строкам символов с адресом 1-го элемента в строке, эта строка заканчивается на
'\0'
(символ конца строки). Когда вы это сделаете,++
он перейдет к следующему адресу в строке (следующий символ).массивы char являются указателем на 1-й символ строки. Поэтому с точки зрения того, как они хранятся в памяти, разницы нет. Разница заключается в синтаксисе, и там лучше использовать синтаксис типа массива, потому что при использовании синтаксиса указателя компилятор должен разрешать перегрузку оператора,
*
поскольку он также используется для умножения, и это немного влияет на производительность при выполнении и компиляции.Также использование массивов проще для человеческого глаза. Синтаксис более понятен с массивами, чем с указателями.