2016-10-12 2 views
-1

Вопрос заключается в том, чтобы найти выход программы follwing. Это вышло в моем тесте, и я ошибся. Мой ответ был 4, 7, 10. Ответ 4,8,12, но мне нужно объяснить, как это работаетМногомерный массив

#include<iostream> 

using namespace std; 

int main() 
{ 
    int number = 4; 
    int array[] = {7,8,9,10,11,12,13}; 
    int *p1 = &number ; 
    int *p2 = array; 
    int *p3 = &array[3]; 
    int *q[] = {p1,p2,p3}; 

    cout << q[0][0] << endl ; 
    cout << q[1][1] << endl ; 
    cout << q[2][2] << endl ; 

    return 0; 
} 
+0

Вы можете просто выполнить код, например, на ideone: http://ideone.com/DPdvKx –

+0

Я знал ответ, я просто хотел объяснить, как это работает. – Teeban

+0

Тогда, пожалуйста, отредактируйте свой вопрос, чтобы указать это. Должен сказать, я думал, что ответ ... потому что ... пока это ... почему это так? –

ответ

3

Что у вас есть не многомерный массив (C++ не действительно есть). У вас есть массив указателей. И указатели могут быть проиндексированы как массивы.

В «графических» формируют массив q выглядит примерно так:

 
+------+------+------+ 
| q[0] | q[1] | q[2] | 
+------+------+------+ 
    |  |  | 
    v  |  v 
+------+ | +-----+----------+----------+-----+ 
|number| | | ... | array[3] | array[4] | ... | 
+------+ | +-----+----------+----------+-----+ 
      v 
      +----------+----------+-----+ 
      | array[0] | array[1] | ... | 
      +----------+----------+-----+ 

Некоторые примечания:

То, что большинство людей называют многомерные массивы на самом деле являются массивы массивов. Подобно тому, как у вас может быть массив целых чисел или как в случае q в вашем коде массив указателей на целые числа, также может быть массив массивов целых чисел. Для более «размерностей» это просто еще одно вложение массивов.

А почему указатели и массивы и могут быть проиндексированы таким же образом, это потому, что для любого массива или указатель a и (действительный) индекс i выражения a[i] равно *(a + i). Это равенство также является причиной того, что вы можете использовать массив как указатель на его первый элемент. Чтобы получить указатель на первый элемент массива, можно написать &a[0]. Он равен &*(a + 0), где операторы адреса и разыменования отменяют друг друга, приводя к (a + 0), который совпадает с (a), который совпадает с a. Таким образом, &a[0] и a равны.

+0

great ASCII art :) –

+0

Как вы создали ASCII-искусство? – PRP

+0

@PRP Просто написал это прямо в ответ. :) –

0

q[0] фактически p1, q[1] фактически p2 и д [2] является p3.

Теперь p1 является адресом number так р1 [0] является просто значение числа, которое ты правильно, чтобы быть вычислена 4.

p2 указывает на массив, так р2 [1] так же, как массив [1 ], который является второй элемент в массиве ot 8.

p3 указывает на подмассива array, начиная с позиции 3. Таким образом, p3[2] такое же, как array[3 + 2] = array[5] = 12.

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