Многомерный массив в С является непрерывным.
int a [4] [5];
состоит из 4 встроенных модулей [5], расположенных в памяти друг друга.
Массив указателей:
INT * а [4];
неровный. Каждый указатель может указывать на (первый элемент) отдельный массив разной длины.
a [i] [j] эквивалентно ((a + i) + j). См стандарт С11, раздел 6.5.2.1:
Де определению оператора индекса [] является то, что Е1 [Е2] идентичен (* ((E1) + (E2)))
Таким образом, [i] [j] эквивалентно (* (a + i)) [j], что эквивалентно ((a + i) + j).
Эта эквивалентность существует, потому что в большинстве контекстов выражения типа массива распадаются на указатели на их первый элемент (стандарт C11, 6.3.2.1). a [i] [j] интерпретируется как:
a - массив массивов, поэтому он распадается на указатель на [0], первый подмассива. a + i - указатель на i-й подрамник a. a [i] эквивалентно * (a + i), разыменовывая указатель на i-й подрамник a. Поскольку это выражение типа массива, оно распадается на указатель на [i] [0]. a [i] [j] эквивалентен ( (a + i) + j), разыменовывая указатель на j-й элемент i-го подмассива a.
Обратите внимание, что указатели на массивы отличаются от указателей на их первый элемент. a + i - указатель на массив; это не выражение типа массива, и оно не распадается, будь то указатель на указатель или какой-либо другой тип.
и по какой-либо причине печать * a в одномерном массиве будет печатать первый элемент массива, тогда как * a в многомерном массиве будет печатать случайное число. Почему это так?
Вывод - это адрес первого элемента массива. Зачем?
printf ("% d \ n", * a);
* a будет эквивалентен [0], который печатает первый элемент массива.
Потому что это 2D-массив. вам нужно разыграть его дважды.Разделение однажды дает вам адрес первой строки/столбца в зависимости от основного массива или большого хранилища столбцов массива. –
'* a' означает' a [0] '. Это еще один массив. Наверное, вы имели в виду 'a [0] [0]'. –
Подумайте, что такое 'a'? – Maroun