2013-08-30 2 views
-2

У меня есть эта программаИспользование указателей в многомерных массивов в C

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int i; 
    int a[][3]={{1,2,3},{4,5,6},{7,8,9}}; 
    printf("\ Elements of an array with their address\n"); 
    for(i=0;i<9;i++) 
    { 
     printf("%8u",&a[0][0]+i); 
     printf("[%d]",*(&a[0][0]+i)); 
     if(i==2 || i==5) 
      printf("\n"); 
    } 

} 

Можете ли вы объяснить, почему (if(i==2 || i==5) используется, я действительно запутаться в этом шаге. Спасибо заранее.

+3

Параметр 'Е ("\ п")' просто чтобы дать вам хороший выход 3х3. Легко проверяется с небольшим контролем или просто запускает программу. :) Если это ваш единственный вопрос, тогда заголовок вашего сообщения немного не работает. – lurker

+2

Вероятно, это было бы понятнее: 'if (i% 3 == 2) printf (" \ n ");' (или 'putchar ('\ n');'). Кроме того, обработка 2D-массива, как если бы это был 1D-массив, скорее всего, будет работать, но, строго говоря, это неопределенное поведение. Но это не то, о чем вы просили, поэтому ... –

+1

Кроме того, '% 8u' - * не * правильный формат для печати адреса. 'printf ("% 8u ", & a [0] [0] + i);' должно быть 'printf ("% p ", (void *) & a [0] [0] + i);' - хотя это может не выравнивать столбцы так же хорошо, так как вывод для '% p' определяется реализацией. –

ответ

3

Массив 0-индексированный, поэтому 2 и 5 являются пятнами перед началом каждой подматрицы, поэтому перед их выводом разбивается строка.

{{1,2,3} , {4,5,6} , {7,8,9}}; 
i=0--^ ^--i=2 ^--i=5 

вывод выглядит примерно так:

 
Elements of an array with their address 
3021239472[1]3021239476[2]3021239480[3] 
3021239484[4]3021239488[5]3021239492[6] 
3021239496[7]3021239500[8]3021239504[9] 

Обратите внимание, каждое измерение массива имеет свою собственную линию.

(адрес памяти может различаться)

+0

И было бы неплохо иметь новую строку в конце, поэтому добавление '|| i == 8' условие было бы хорошим, или использовать 'if (i% 3 == 2)' как условие. –

0

Я попытаюсь объяснить этот код вам, во-первых, потому что вы должны сначала понять программу рассуждать конкретную вещь.

Здесь, хотя для людей массив находится в 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)

Смежные вопросы