char * strings[]
- это массив указателей .Когда вы инициализируете его как
char * strings[] = { "John", "Paul", NULL};
, строки John
Paul
являются строковыми литералами .Это константы, которые существуют где-то в коде или только для чтения.Для этого нужно скопировать указатель на строковый литерал John
в strings[0]
и так далее.т.е.
strings[0] --> holds a pointer to "John".
strings[1] --> holds a pointer to "Paul"
Обратите внимание, что строковые литералы не должны изменяться вашей программой.Если вы это сделаете, это неопределенное поведение.
В случае char ** strings
Это указатель на указатель .Это отдельная ячейка памяти, и она не может содержать много указателей самостоятельно.Таким образом, вы не можете инициализировать его, как показано ниже.
char ** strings = { "John", "Paul", NULL}; // error
Однако указатель на указатель может использоваться вместе с динамическим выделением памяти (malloc
, calloc
и т. Д.) Для указания на массив строк.
char string[] = "John";
В этом случае у вас есть массив символов , в который копируется строковый литерал.Этот шаг выполняется компилятором, как правило, в коде запуска перед запуском основного.
char * string = "Paul";
Здесь у вас есть указатель на символ , который указывает на строковый литерал.
Разница между двумя приведенными выше инструкциями заключается в том, что в случае массива char вы можете изменять элементы string
, но не можете во втором случае.