Что это значит в c? char * array = {“**”, “**”, “**”};

В некотором коде, который я читал, был инициализирующий оператор вроде этого

char *array[]= { "something1", "something2", "something3" }; 

Что это значит, и на что указывает этот указатель? Как это распределено в памяти и как я могу получить доступ к каждому элементу и каждому символу элемента в этом массиве?

— Отредактировано — и, пожалуйста, какая разница в этом примере между char array [3]; и char * array [3]; — Отредактировано —

что это значит ?

Он инициализирует массив строк ( char * ) с тремя значениями (три указателя на нуль-завершающие строки)

и на что указывает этот указатель?

Он должен указывать на первый элемент в массиве char*

как это распределено в памяти?

Он будет выделять достаточно памяти для хранения трех строк, за которыми следуют нуль-терминаторы, а также три указателя на эти строки:

 array --> pointer to three sequential memory addresses array[0] --> something1{\0} array[1] --> something2{\0} array[2] --> something3{\0} 

Обратите внимание, что строки могут не обязательно находиться в последовательной памяти

и как я могу получить доступ к каждому элементу

если под «элементом» вы подразумеваете строку, вы можете зацикливать по указателям:

 for(int i=0; i<3; i++) { char* element = array[i]; } 

и каждый символ элемента в этом массиве

ну, вы могли бы получить доступ к символам с помощью синтаксиса массива ( element[i] ), но я бы рекомендовал использовать функции строки C для обеспечения безопасности (так что вам не нужно беспокоиться о доступе к памяти за пределами диапазона строки)

Это способ инициализации массива в то же время, когда вы его создаете.

Этот код

 char *array[]= { "a", "b", "c" }; 

будет иметь тот же результат, что и этот код.

 char *array[3]; array[0] = "a"; array[1] = "b"; array[2] = "c"; 

Вот хороший источник для получения дополнительной информации.

http://www.iu.hio.no/~mark/CTutorial/CTutorial.html#Strings

РЕДАКТИРОВАТЬ:

char array[3]; представляет собой массив из 3 char . char *array[3]; представляет собой массив из 3 указателей на char .

char * в C является строкой.

array – это имя объявляемой переменной.

[] указывает, что это массив.

{ "something1", "something2", "something3" } инициализирует содержимое массива.

Доступ к элементам выполняется следующим образом:

array[0] дает 1-й элемент – «something1».

array[1] дает второй элемент – «something2».

и т.п.

Замечания:

Как было отмечено в комментариях, char * не является технически строкой.

Это указатель на char . Вы можете визуализировать строку в памяти следующим образом:

 <--------------------------> ..134|135|136|137|138|139|.. <--------------------------> 'H'|'e'|'l'|'l'|'o'|'\0' <--------------------------> 

Этот блок памяти (позиции 134-139) содержит строку символов.

Например:

array[0] фактически возвращает указатель на первый символ в «something1».

Вы используете тот факт, что символы последовательно хранятся в памяти для доступа к остальной части строки различными способами:

 /* ch points to the 's' */ char* ch = array[0]; /* ch2 points to the 'e' */ char* ch2 = ch + 3; /* ch3 == 'e' */ char ch3 = *ch2; /* ch4 == 'e' */ char ch4 = *(ch + 3); /* ch5 == 'e' */ char ch5 = ch[3]; 

Это определяет массив указателей на символы (aka. «C строк»).

Для доступа к содержимому, которое вы могли бы сделать:

 for (int i=0; i 

Он объявляет array как массив из 3 указателей на char , а его 3 элемента инициализируются указателями на соответствующие строки. Память выделяется для самого массива (3 указателя) и для строк. Память строк распределяется статически. Память массива выделяется либо статически (если объявление вне всех функций), либо динамически (как правило, в стеке выполнения ЦП), если декларация находится внутри функции.