2015-03-29 4 views
0

Имейте проблему. Например у меня есть кодПолучить элемент двумерного массива с указателями

class A 
{ 
public: 
int **p; 
const int size=4; 
A() 
{ 
    p=new int*[size]; 
    for(int i = 0 ; i<size;i++) 
    { 
     p[i]=new int[size]; 
    } 

    for(int i = 0 ;i<size*size;i++) 
    { 
     *(*p+i)=0; 
    } 
} 
}; 

Затем я создаю динамический объект класса A *matrix=new A; Как я могу получить доступ общественности к **p? Я знаю, как сделать это с помощью функции:

int A::GetElement(int position) 
{ 
return *(*p+position); 
} 

, но интересно, как это сделать с простым способом. Я пробовал matrix->*(*p+i), но он не работал.

+0

'X [Y],' такого же, как '* (X + Y)', это действительно гораздо яснее использовать обозначение массива. Если вы написали 'p [0] [i] = 0;' вместо '* (* p + i) = 0;' у вас было бы больше шансов обнаружить вашу ошибку. –

ответ

2

Просто используйте 2 индекса для двух индексов массива.

#include <iostream> 

class A 
{ 
public: 
int **p; 
const int size=4; 
A() 
{ 
    p=new int*[size]; 
    for(int i = 0 ; i<size;i++) 
    { 
     p[i]=new int[size]; 
    } 

    for(int i = 0 ;i<size*size;i++) 
    { 
     p[i/4][i % 4] = 16 - 1 - i; 
    } 
} 
~A() 
{ 

    for(int i = 0 ; i<size;i++) 
    { 
     delete[] p[i]; 
    } 
    delete[] p; 
} 
}; 

int main(int, char**) 
{ 
    A* a = new A(); 

    int i, j; 
    for(i = 0; i < a->size; i++) 
    { 
     for(j = 0; j < a->size; j++) 
     { 
      std::cout << a->p[i][j] << '\n'; 
     } 
    } 

    for(i = 0; i < a->size; i++) 
    { 
     for(j = 0; j < a->size; j++) 
     { 
      std::cout << *(*(a->p + i) + j) << '\n'; 
     } 
    } 

    for(int i = 0 ;i<(a->size * a->size);i++) 
    { 
     std::cout << *(*(a->p + (i/a->size)) + (i % a->size)) << '\n'; 
    } 

    delete a; 
} 

Использование указателя разыменования.

std::cout << *(*(a->p + i) + j) << '\n'; 

Но по-прежнему требуется двойная петля.

Внутри одного цикла

std::cout << *(*(a->p + (i/a->size)) + (i % a->size)) << '\n'; 
+0

Благодарим вас за помощь, но я хочу знать, как это сделать с указателями ( – SuperMan

+0

Добавлен с помощью указателей, но это все еще может не быть кратким решением, которое вы искали. –

+0

Спасибо !!! =) – SuperMan