Что это значит в c? char * array [] = { «**» , «**» , «**» };

Вопрос:В некотором коде, который я читал, был инициализирующий оператор вроде этого char *array[]= { "something1", "something2", "something3" }; Что это значит и что на самом деле указывает этот указатель? Как это распределено в памяти и как я могу получить доступ к каждому элементу и каждому символу элемента в этом массиве? --- Отредактировано --- и пожалуйста,

Вопрос:

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

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

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

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

Лучший ответ:

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ №1

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

Этот код

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

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

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

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

EDIT:

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

Ответ №2

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’|’’ <—————————>

Этот блок памяти (позиции 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]; Ответ №3

Определяет массив указателей char (ака. “c строк” ).

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

for (int i=0; i<sizeof(array)/sizeof(char*); i++) { printf(«%s», array[i]); } Ответ №4

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

Оцените статью
Добавить комментарий