... Независимо от ответа на этот вопрос ..
Почему нет 2 из []?
Семантика может влиять на ваше понимание массивов и ихтребования к индексации.C
имеет массивы для int
и char
, для каждого из которых требуется один набор []
для определения.Существует специальный вид массива char
в C
, обычно называемый C String
, который представляет собой обычный массив char
с последним символом, являющимся нулевым терминатором: \0
.Массив C strings
обычно использует два набора скобок: [][]
.Правила для представления массива char
такие же, как для представления массива int
.оба могут быть описаны как набор значений, хранящихся в непрерывном наборе областей памяти.Для иллюстрации приведем примеры массивов int
, char
и C string
:
int numarr[] = {99,104,97,114,32,97,114,114,97,121,0};
char chararr1[] = {'c','h','a','r',' ','a','r','r','a','y','\0'};
char chararr2[] = {99,104,97,114,32,97,114,114,97,121,0};
char string[] = {"char array"};
Значения массива в каждом из 4 приведенных выше примеров идентичны.В большинстве реализаций массив int
хранится в непрерывном наборе 4-байтовых областей памяти, в то время как каждый из массивов char
хранится в смежном наборе 1-байтовых областей памяти.Три char
массива, если они используются в printf()
, приведут к одному и тому же выводу string , поскольку каждый из них является массивом char
, оканчивающимся нулевым значением.
printf("%s\n%s\n%s\n", chararr1, chararr2, string);
массив символов
массив символов
массив символов
Подробнее о специальном массиве char
- строка и массивах Cстрока
char string[] = {"this is a string"};
A C строка определяется как массив с нулевым символом в конце char
: содержимое, размеченное между ^
, равно string
, определенному выше.Обратите внимание на нулевое завершение.
|t|h|i|s| |i|s| |a| |s|t|r|i|n|g|\0|?|?|
^ ^
Непрерывный набор строк C или массив строк C однако можно представить с помощью двух наборов квадратных скобок:
char strings[2][20] = {"first string", "second string"};
Этот массивстроки будет выглядеть в памяти так:
|f|i|r|s|t| |s|t|r|i|n|g|\0|s|e|c|o|n|d| |s|t|r|i|n|g|\0|?|?|?|
| | | |
[0] | | [1] 1st index used to access full string
[0][4]='t' [0][10]='n' 2nd index used to access array elements
В то время как каждая строка может быть доступна с помощью первого индекса,
eg. strings[0] = "first string" and strings[1] = "second string"
каждый символ каждой строки может быть доступен с помощью первогои второй индекс
eg. strings[0][0] == 'f' and strings[1][0] == 's'