@slavapegaskin

Что означает char **s на языке Си?

Что означает char **s? Я понимаю, что это указатель на указатель, который в свою очередь указывает на char. Но как в таком случае инициализировать переменную s, каким значением (или используя какую структуру языка)? Где используются такие выражения?
  • Вопрос задан
  • 20147 просмотров
Решения вопроса 2
@Mercury13
Программист на «си с крестами» и не только
Указатель на указатель.

Используется…
1. Для многомерных массивов (в Си нечасто — ведь есть настоящие многомерные массивы; обычно в структурах посложнее, чем тупой массив M×N). Вот у меня есть самодельный (неполный) аналог std::deque (динамический массив, состоящий из кусочков и никогда ничего не перемещающий). Там внутри std::vector<T*>, который служит массивом массивов. А у вектора внутри — T**.
2. Для массивов (1-е измерение) строк (2-е измерение).
3. Для передачи указателя по указателю (см. описание функции strtod).
4. (Крайне редко) И просто как указатель на указатель

Как инициализировать?
1.
char row0[] = { 'A', 'B' };
char row1[] = { 'C', 'D' };
char* arr1[] = { row0, row1 };
char** data1 = arr;

2. 
char* arr2[] = { "AB", "CD" };
char** data2 = arr2;

3. 
char* errptr;
int r = strtod("10", &errptr);
return (*errptr != '\0') ? ERROR : r;

4.
char* data = "Data";
char** pData = &data;
Ответ написан
@abcd0x00
Что означает char **s?

Есть, например, char x - это область в памяти размером один байт, у которой есть имя x. Область в памяти имеет свой адрес в памяти. И этот адрес - это такое целое число (обычно четырёхбайтовое, но может быть и восьмибайтовое).
x = 'a';
Есть, например, char *px - это область в памяти размером четыре байта, у которой есть имя px. В эту область можно сохранить адрес байта в памяти.
px = &x;
Есть, например, char **ppx - это область в памяти размером четыре байта, у которой есть имя ppx. В эту область можно сохранить адрес области в памяти, в которой хранится адрес байта в памяти.
ppx = &px;
Теперь ты можешь применить операцию разыменования указателя (или операцию ссылки по адресу) и получить значение из x через указатель ppx. Выражение **ppx даст значение 'a'.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
15432
@15432
Системный программист ^_^
char * buffer = NULL;
char ** bufptr = &buffer;
some_alloc_function(bufptr);
If (buffer != NULL)
printf("alloc success\n");
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
А char **s - резервирует область памяти и возвращает ссылку на ссылку на ячейку памяти и помещает значение в переменную s, Иначе говоря, инициализирует двумерный массив указателей.
Используются: например - когда нужно работать с N-мерными структурами данных неопределённого/неизвестного размера и типа.
Ответ написан
char* - это по соглашению Си-строка, то есть указатель на буфер символов, оканчивающийся нулевым байтом '\0'. Для любого типа T, кроме, вероятно, char, T* может быть массивом, а именно, указателем на его первый элемент. Соответственно, char** s - это, скорее всего, массив строк. s[2] - это указатель на третью строку, s[2][3] - это четвёртый символ третьей строки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы