1. Как и другие ответы и комментарии сказал, выражение "символ * exStr []" означает "массив указателей на символ".
а) Как читать
Лучший способ читать его (а также другие более сложные заявления C), чтобы начать по имени твари (в данном случае «exStr») и работать ваш путь к концы декларации, как это:
- Сначала идут вправо, добавляя каждый сталкивался значимый символ (ы) в значении выражения
- Stop происходит прямо на первой закрывающей paranthesis «)», или когда выражение заканчивается
- Когда yo u больше не может идти дальше, возобновить, где вы начали, и идти влево, снова добавляя каждый столкнутый символ к значению выражения
- Остановитесь налево в скобках »(« что соответствует «)», который остановил вас справа , или в начале выражения
- Когда вы остановились налево у "(" paranthethis и вы не достигли начала выражения, возобновите движение сразу после соответствующего ему ")"
- Keep движение вправо и влево до тех пор, пока вы не достигнете полей выражения в обоих направлениях.
В вашем случае вы бы хотели:
- старт на exStr: это имя переменной
- идти направо: []: exStr является массив
- идти направо: остановка: нет ничего там, Знак «=» останавливает нас
- go left: *: exStr - это массив из указатели
- налево: символ: exStr является массив из указателей к полукокса
- налево: остановка: нет ничего там, "=" знак остановки нам
б) Почему вы видите, что каждый элемент массива занимает разное количество байт
Если у вас есть значение, подобное "Zorro"
, это строка C.
AC строка представляет собой массив байт, который начинается с заданным адресом в памяти и заканчивается 0. В случае "Zorro"
она будет занимать 6 байт: 5 для строки, шестой по 0.
У вас есть несколько способы создания строк C. Несколько распространенными из них являются:
А) использовать его в буквальном смысле, например:
printf("Zorro");
B) использовать его literraly но хранить его в переменной:
char *x = "Zorro";
C) выделяют динамически и копировать данные в него
size_t n = 2;
char *p = malloc((n+1) * sizeof(char));
char c = getch(); // read a character from the console
p[0] = c;
p[1] = 0;
// do something with p...
free(p);
Всякий раз, когда вы помещаете значение строки, как "Zorro"
в вашей программе, компилятор будет зарезервировать память для достаточно просто удерживайте эту строку плюс 0-терминатор. Он будет инициализировать эту память с помощью того, что вы указали внутри "", оно добавит 0 и тайно сохранит указатель на эту память. Это не позволит вам изменить эту память (вы не можете изменить эту строку).
В вашем примере кода он сделал это для каждой строки, которая появилась в инициализации exStr.
Вот почему вы видите, что каждый элемент массива занимает различный объем памяти. Если вы посмотрите ближе к выходу отладчика, вы увидите, что зарезервированная память компилятора для строки сразу после предыдущей, и каждая строка занимает свою длину в байтах плюс терминатор 0. Например. «Zorro» начинается с 02f и занимает позиции 02f - 034, которые составляют 6 байт (5 для Zorro и 1 для терминатора 0). Затем «Алекс» начинается с 035, занимает 5 байт: 035 - 039 и т. Д.
2. Чтобы создать подобный массив программно:
Если все у вас есть некоторые статические строки, как в вашем примере, то ваш пример кода достаточно хорошо.
В противном случае, если вы планируете поставить динамические значения в массиве (или, если вы планируете изменить исходные строки в программе), вы могли бы сделать что-то вроде:
#define COUNT 5
char *strings[COUNT];
int i;
for (i = 0; i < COUNT; i++) {
int n = 32; // or some other suitable maximum value, or even a computed value
strings[i] = malloc((n+1) * sizeof(char));
// put up to 32 arbitrary characters into strings[i], e.g. read from a file or from console; don't forget to add the 0 terminator
}
// use strings...
// free memory for the strings when done
for (i = 0; i < COUNT; i++) {
free(strings[i]);
}
Просто прочитайте заявление назад: 'полукокса * exStr [] ': массив указателей на символы. Каждый указатель указывает на первый символ в каждой строке с нулевым завершением. –
Пожалуйста, не используйте странное форматирование, чтобы указать на что-то конкретное, используйте комментарии. –
Ваш второй вопрос не ясен, вы можете уточнить? –