Я попытаюсь объяснить этот код вам, во-первых, потому что вы должны сначала понять программу рассуждать конкретную вещь.
Здесь, хотя для людей массив находится в 2-мерном матричном формате (3 X 3), для адреса компьютера он имеет постоянную память. Скажем, например, когда он начинается с адреса 1000 (хотя исходная реализация будет иметь шестнадцатеричную адресную систему). Затем 9 элементов хранятся в следующих 36 байтах, так что каждое целое число принимает 4 байта.
Теперь в вашем коде вы проходите от 1 до 9 целых чисел, увеличивая с первого адреса. Вместо этого вы можете использовать для этого целочисленный указатель.
Хотя он находится в непрерывном пространстве памяти, для людей нам нужен матричный вид вывода, потому что в этом представлении мы поняли только вещи 2D-массива. Итак, для этого нам нужно break-ups
в массиве continuos. Для этого здесь row size
- 3
. Так как индекс начинается с нуля, мы получаем break
формат вывода новой строкой ('\ n') для каждого третьего элемента.
Следовательно, после того, как (0,1, 2 <- Here we have breakup say)
Тогда (3,4, 5 <- Here too)
Параметр 'Е ("\ п")' просто чтобы дать вам хороший выход 3х3. Легко проверяется с небольшим контролем или просто запускает программу. :) Если это ваш единственный вопрос, тогда заголовок вашего сообщения немного не работает. – lurker
Вероятно, это было бы понятнее: 'if (i% 3 == 2) printf (" \ n ");' (или 'putchar ('\ n');'). Кроме того, обработка 2D-массива, как если бы это был 1D-массив, скорее всего, будет работать, но, строго говоря, это неопределенное поведение. Но это не то, о чем вы просили, поэтому ... –
Кроме того, '% 8u' - * не * правильный формат для печати адреса. 'printf ("% 8u ", & a [0] [0] + i);' должно быть 'printf ("% p ", (void *) & a [0] [0] + i);' - хотя это может не выравнивать столбцы так же хорошо, так как вывод для '% p' определяется реализацией. –