Является ли char ** указателем на массив строк в C? - PullRequest
0 голосов
/ 30 апреля 2019

Насколько я понимаю, char* X - это переменная, которая указывает на один символ или массив символов (строку) в C.

char** - это указатель, который указывает на другой указатель, который в конечном итоге указывает на один символ или массив символов.

, если int** эквивалентно созданию многомерного массива, почему я не могу создать массив строк в C, используя char**?

const char** day = {
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"
};

Здесь *day будет указывать на сам массив, а **day будет указывать на первый элемент массива "Sunday"?

Ответы [ 2 ]

4 голосов
/ 30 апреля 2019

почему я не могу создать массив строк в C, используя char **? да, вы можете создать.Правильный способ - использовать массив указателей на символы , а не двойной указатель char**, как вы это сделали.Например,

const char* day[7] = {
    "Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"
};

выше day - это массив указателей символов , а каждый его элемент - символьный указатель , и каждый элемент должен указывать на действительный адрес.Здесь day[0] - это символьный указатель, указывающий на строковый литерал sunday, который является действительным адресом.

Это также возможно через char**, но не так, как вы.Например,

char **day = {"sunday", "Monday" };

здесь проблема в том, что вы не выделили память для day[0], day[1] для хранения некоторого строкового литерала, например sunday и т. Д.

Сначала выделите памятьдля day, как показано ниже

char **day = malloc(NUM_OF_DAYS * sizeof(*day)); /* define NUM_OF_DAYS as 7 */

А затем выделить память для day[0], day[1] и т. д.

for(int index =0 ; index < NUM_OF_DAYS; index++) {
   day[index] = malloc(MAX_DAY_SIZE * sizeof(**day)); /* define this MACRO */
}

И затем вы сканируете данные во время выполнения.

1 голос
/ 30 апреля 2019

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], не имеет значения, он по-прежнему не является массивом (и [] на самом деле никогда не используется для типов массивов, Поддерживают ли указатели «индексацию стиля массива»? ).

Дополнительная информация: Правильное размещение многомерных массивов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...