Главное, чтобы понять, что C не имеет ничего, кроме одномерных массивов. Да, двумерные массивы (например, матрицы) на самом деле не существуют в C.
Однако массив имеет элементы одинакового размера (как указано sizeof
) и типа. Таким образом, вы можете иметь массивы чисел, массивы указателей, массивы struct
-s и даже массивы массивов (например, целых чисел).
Таким образом, злоупотребляя, вы можете сказать, что массив массивов является матрицей (поэтому некоторые люди утверждают, что двумерные массивы существуют в C. Я чувствую, что это преувеличение). Но это (например, что-то объявленное как int a[10][20];
) действительно сохраняет одномерный массив (из 10 элементов каждый является массивом) из одномерных массивов (из 20 целых чисел). И во многих случаях полезен массив указателей (например, массивы «строк»).
Интересной особенностью в C99 (или более поздней версии) является гибкий элемент массива s. При этом вы можете грамотно определить свой собственный Matrix
абстрактный тип данных , используемый как непрозрачный указатель (см. этот ответ для некоторого кода).
Во многих случаях (особенно когда вы присваиваете массив - по праву присваивания - некоторому lvalue, например, переменной, или передаете массив в качестве аргумента некоторой функции), массивы распадаются на указатели. Но их sizeof
и тип разные.
Посмотрите на некоторый C эталонный сайт (и намного позже, на стандарт n1570 C, например, §6.5.2.1 Подписка на массив ). Читать Как отлаживать небольшие программы
Кстати, так называемые двумерные массивы в C, такие как int a[10][20];
, редко нужны в C (если вы не специализируетесь на численных вычислениях на матрицах фиксированных измерений, известных во время компиляции; я полагаю, что разработчики игр может использовать тип как typedef double transform3Dmatrix_ty[3][3];
довольно часто). За более чем 30-летний опыт программирования я почти никогда не использовал 2D-массивы.
Я не претендую на то, чтобы научить вас С в нескольких параграфах. Вы найдете много хороших книг (и несколько очень плохих).