В чем разница между char s [] и char * s? - PullRequest
479 голосов
/ 10 ноября 2009

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

char s[] = "hello";

или как это:

char *s = "hello";

Так в чем же разница? Я хочу знать, что на самом деле происходит с точки зрения продолжительности хранения, как во время компиляции, так и во время выполнения.

Ответы [ 13 ]

0 голосов
/ 01 июня 2019
char *s1 = "Hello world"; // Points to fixed character string which is not allowed to modify
char s2[] = "Hello world"; // As good as fixed array of characters in string so allowed to modify

// s1[0] = 'J'; // Illegal
s2[0] = 'J'; // Legal
0 голосов
/ 10 ноября 2009

В свете комментариев здесь должно быть очевидно, что: char * s = "hello"; Это плохая идея, и ее следует использовать в очень узких рамках.

Это может быть хорошей возможностью указать на то, что "правильная константность" - это "хорошая вещь". Всегда и везде Вы можете использовать ключевое слово «const» для защиты своего кода от «расслабленных» вызывающих или программистов, которые обычно наиболее «расслаблены», когда в игру вступают указатели.

Достаточно мелодрамы, вот чего можно добиться, украсив указатели "const". (Примечание: нужно читать объявления указателя справа налево.) Вот 3 различных способа защитить себя при игре с указателями:

const DBJ* p means "p points to a DBJ that is const" 

- то есть объект DBJ нельзя изменить с помощью p.

DBJ* const p means "p is a const pointer to a DBJ" 

- то есть вы можете изменить объект DBJ через p, но вы не можете изменить сам указатель p.

const DBJ* const p means "p is a const pointer to a const DBJ" 

- то есть вы не можете изменить сам указатель p, а также не можете изменить объект DBJ через p.

Ошибки, связанные с попытками мутаций констант-муравьев, обнаруживаются во время компиляции. Для const нет места во время выполнения или скорости.

(Предположим, вы используете компилятор C ++, конечно?)

- DBJ

0 голосов
/ 10 ноября 2009

В случае:

char *x = "fred";

x - это lvalue - его можно назначить. Но в случае:

char x[] = "fred";

x не lvalue, это rvalue - вы не можете присвоить ему.

...