Если вы хотите превратить ваш 2D-массив во что-то, что является массивом указателей на указатели на символы, вам нужно будет либо выделить место для вашего char**
в стеке в локальной области видимости, либо динамически.Если вы выберете локальную область видимости, вам нужно будет просто создать массив char*
, а затем сделать так, чтобы каждый член вашего массива указывал на каждую строку следующим образом:
char a[][20]={"Hi","Hello","Bye","Good Morning", "" };
int total_strings = 0;
int index = 0;
while(strlen(a[index++])) total_strings++;
char* ptrs[total_strings];
for (int i = 0; i < total_strings; i++)
{
ptrs[i] = a[i];
}
Теперь вы можетеиспользуйте массив указателей, например ptr[i][j]
(где j
меньше длины строки в индексе i
), и если вам нужно передать его функции по ссылке или назначить ее другой переменной, то *Массив 1009 * превращается в указатель, поэтому вы можете передать ptrs
как char**
в функцию или в другую переменную char**
.
Следующим подходом будет динамическое выделение массива указателей... это будет выглядеть следующим образом:
char a[][20]={"Hi","Hello","Bye","Good Morning", "" };
int total_strings = 0;
int index = 0;
while(strlen(a[index++])) total_strings++;
//dynamic allocation of string pointer array
char** ptrs = calloc(total_strings, sizeof(char*));
for (int i = 0; i < total_strings; i++)
{
ptrs[i] = a[i];
}
//...more code
free(ptrs);
Кстати, вы не можете сделать что-то столь же простое, как char** ptr = a
... из-за способа, которым C ожидает память для char**
подлежит выкладке.Другими словами, char array[][]
на самом деле является линейным массивом в памяти, даже если он может быть проиндексирован как двумерный массив.С другой стороны, char** ptr
- это переменная, которая содержит адрес памяти, указывающий на массив указателей.Таким образом, оба ptr
должны содержать адрес, который указывает на правильный массив указателей, а каждый указатель ptr[i]
должен содержать адрес, указывающий на массив char
.Выполнение чего-то такого простого, как char** ptr = a
, не создает правильную структуру памяти для этого.