2013-04-05 2 views
0

Хорошо, я пытаюсь поднять голову вокруг указателей, но как только я начну использовать что-то вроде class **c, я заблудился.C++ Как использовать динамический массив указателей?

Говорят, у меня был

struct POINT{ int x, y, z; }; 
struct POLYGON{ POINT **vertices; int size; }; 

POINT points[10]; 
InputPoints(points,10); //fills up the points array somehow 

POLYGON square; 
//the following is where I'm lost 
square.vertices = new *POINT[4]; 
square.vertices[0] = *points[2]; 
square.vertices[1] = *points[4]; 
square.vertices[2] = *points[1]; 
square.vertices[3] = *points[7]; 

На данный момент, square должен держать массив указателей, причем каждый опорный пункт в points. Тогда

square.vertices[2].x = 200; //I think this is done wrong too 

должны изменить points[1].x 200.

Как изменить код выше на самом деле это сделать? И хотя я понимаю, что использование std :: vector будет лучше, я пытаюсь узнать, как работают указатели.

+0

Вы уверены, что эта линия, square.vertices [0] = * points [2]; и все следующие три строки работают правильно? point - это массив POINT, и вы должны написать его как; square.vertices [0] = & points [2]; что ты говоришь? – nommyravian

+0

Да, это выглядит лучше. Я попробую это (ответ tacp говорит то же самое). Мой код, приведенный выше, был просто попыткой проиллюстрировать то, что я хотел сделать. Я не думаю, что он даже компилируется. – slicedtoad

ответ

1

Вы можете сделать что-то вроде следующего: (при условии, что vertices хранит две точки)

POINT points[2]; 
POINT p1 = {10,20,30}; 
POINT p2 = {20,30,50}; 
points[0] = p1 ; 
points[1] = p2; 

POLYGON square; 
//the following is where I'm lost 
square.vertices = new POINT*[2]; //pay attention to syntax 
square.vertices[0] = &points[0]; //vertices[0] stores first point 
square.vertices[1] = &points[1]; //you should take address of points 

square.vertices[0][0].x = 100; 
std::cout << square.vertices[0][0].x 
    <<std::endl; //this will change the first point.x to 100 
return 0; 

Вы можете, конечно, обновить это в соответствии с вашими потребностями.

+0

ОК, я думаю, что это должно делать то, что я хочу. Одна вещь, хотя доступ к второй точке через квадрат сделан как? 'square.vertices [0] [1] .x' или' square.vertices [1] [0] .x'? Кажется, действительно странно использовать квадратные скобки дважды, чтобы ввести 1d-массив, есть ли способ использовать '' '' '' '' '' 'совместно с одним набором' [] 'вместо этого? – slicedtoad

+0

'(* vertices [0]). X', кажется, работает вместо' square.vertices [0] [0] .x'. По крайней мере, когда я внутри структуры. Не уверен, что извне я полагаю, что это будет '(* square.vertices [0]). X' или, может быть,' square. (* Vertices [0]). X' – slicedtoad

+0

@slicedtoad второй пункт должен быть доступен с помощью квадрата [ 1] [1] .x. Вы на самом деле обращаетесь к элементам 2D-массива, а не к массиву 1D, поэтому нормально иметь два [], вы можете думать о доступе к элементам 2D-массива. Надеюсь, это вас больше не смущает. – taocp

1

Есть два подхода к решению:

  • Polygon хранит копию Point (это использует Point *)
  • Polygon2 хранит указатель на Point (это использует Point **)

Ниже приведена программа с некоторыми изменениями в коде OP, который иллюстрирует оба способа. Код также доступен на http://codepad.org/4GxKKMeh

struct Point { int x, y, z; }; 

struct Polygon { 
    // constructor: initialization and memory allocation 
    Polygon(int sz) : size(sz), vertices(0) { 
     vertices = new Point[ size ]; 
    } 
    ~Polygon() { 
     delete [] vertices; 
     vertices = 0; 
    } 
    int const size; 
    Point * vertices; // note: single pointer; dynamically allocated array 
}; 

struct Polygon2 { 
    // constructor: initialization and memory allocation 
    Polygon2(int sz) : size(sz), pPoints(0) { 
     pPoints = new Point * [ size ]; 
    } 
    ~Polygon2() { 
     delete [] pPoints; 
     pPoints = 0; 
    } 
    int const size; 
    Point ** pPoints; // note: double pointer; points to Points :-) 
}; 


int main() { 

    Point points[10]; 

    // Fill up the points 
    // InputPoints(points, 10); 

    Polygon square(4); 
    square.vertices[0] = points[2]; 
    square.vertices[1] = points[4]; 
    square.vertices[2] = points[1]; 
    square.vertices[3] = points[7]; 

    Polygon2 square2(4); 
    square2.pPoints[0] = & points[2]; 
    square2.pPoints[1] = & points[4]; 
    square2.pPoints[2] = & points[1]; 
    square2.pPoints[3] = & points[7]; 
} 
+0

Я не совсем понимаю это. 'POLYGON' содержит указатель' POINT'. Затем в местоположении этого указателя объявляется массив типа 'POINT'. Затем вы, похоже, начинаете заполнять этот массив указателями. Разве это не должно быть несоответствием типа? Я не думал, что массив, объявленный для хранения структуры, может содержать указатели. Но скажи мне, если я что-то упустил. – slicedtoad

+0

@slicedtoad: Вы правы, в моей первой версии были некоторые синтаксические ошибки, я исправил это и загрузил новый код. Обратите внимание, что есть два похожих, но очень тонких способа решения проблемы. В моем коде я показал оба пути. – Arun

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