char* X
- это переменная, которая указывает на один символ или массив символов (строку) в C.
Нет, это переменная, которая содержит адрес одного персонажа.Этот одиночный символ может быть или не быть началом строки с нулевым окончанием.
Таким образом char**
указывает на char*
, который указывает на символ.
, если int**
эквивалентно созданию многомерного массива
Это не так.int**
не имеет ничего общего с многомерными массивами.
почему я не могу создать массив строк в C, используя char**
?
Посколькуchar**
не является массивом и не может, строго говоря, указывать на единицу.
A char*
может использоваться для указания строки с нулевым окончанием.Поэтому, если вам нужен массив строк, вам нужен массив char*
.Например, это можно записать как:
char* day[] = { ... };
Теперь, как выясняется, char**
может использоваться для указания на адрес первого элемента этого массива, &day[0]
, так как это char*
.Это часто заставляет людей путать char**
для многомерных массивов, потому что это действительно так:
char* day[] = { "Sunday", ... };
char** week = &day[0];
printf("%c", week[0][0]); // prints 'S'
Но это не делает char**
массивом и не делает его двумерным массивом.
Вы также можете использовать char**
для динамического выделения справочной таблицы строк, где каждая строка имеет переменную длину:
char** week = malloc(7 * sizeof(char*));
for(int i=0; i<7; i++)
{
week[i] = malloc( ... );
}
Здесь снова char**
точекна первый элемент одномерного массива char*
.Это не двумерный массив, он не указывает ни на один.То, что он допускает синтаксис week[i][j]
, не имеет значения, он по-прежнему не является массивом (и []
на самом деле никогда не используется для типов массивов, Поддерживают ли указатели «индексацию стиля массива»? ).
Дополнительная информация: Правильное размещение многомерных массивов .