В C строки представлены как char []. Строка всегда должна заканчиваться последним символом в массиве, являющимся нулевым символом, "\ 0". Нулевой символ имеет целочисленное значение 0. Чтобы объявить строку, размер строки всегда будет "# символ" + "нуль-символ". Вот почему код не запустится, если вы измените второе число в объявлении массива с 6 на 5, поскольку для представления слова «три» в виде строки необходим массив символов ['t', 'h', 'r',' e ',' e ',' \ 0 '], длина которого 6 символов.
Когда вы выделяете 2d массив, например, int arr [a] [b]Вы выделяете пространство в памяти размером "size of" * a * b. В памяти это представлено одной длинной «полосой» памяти. Вот почему вы можете индексировать в 2d массив, используя arr [x] [y] или arr [x * a + y].
Следующий код распечатывает весь 2d блокпамяти как в виде символов, так и целых чисел.
/******************************************************************************
Online C Compiler.
Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <stdio.h>
int main()
{
int row = 11;
int col = 6;
//scanf("%d\n%d", &a, &b);
char labels[11][6] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "even", "odd"};
// Header
printf("\n== labels as char ==\n");
printf(" ");
for (int y = 0; y < col; y++) printf("%-2i ", y);
printf("\n");
for (int x = 0; x < row; x++)
{
printf("%2i ", x);
for (int y = 0; y < col; y++)
{
printf("%2c ", labels[x][y]);
}
printf("\n");
}
// Header
printf("\n== labels as int ==\n");
printf(" ");
for (int y = 0; y < col; y++) printf("%-3i ", y);
printf("\n");
for (int x = 0; x < row; x++)
{
printf("%3i ", x);
for (int y = 0; y < col; y++)
{
printf("%3i ", labels[x][y]);
}
printf("\n");
}
return 0;
}
При запуске код генерирует следующий вывод.
== labels as char ==
0 1 2 3 4 5
0 o n e
1 t w o
2 t h r e e
3 f o u r
4 f i v e
5 s i x
6 s e v e n
7 e i g h t
8 n i n e
9 e v e n
10 o d d
== labels as int ==
0 1 2 3 4 5
0 111 110 101 0 0 0
1 116 119 111 0 0 0
2 116 104 114 101 101 0
3 102 111 117 114 0 0
4 102 105 118 101 0 0
5 115 105 120 0 0 0
6 115 101 118 101 110 0
7 101 105 103 104 116 0
8 110 105 110 101 0 0
9 101 118 101 110 0 0
10 111 100 100 0 0 0
Как видите, все символы, не используемые строками, имеют нулевойсимволы, обозначающие конец слова.