2013-08-01 4 views
-6

C++, как инициализировать этот указатель:C++ указатель на указатель на массив, состоящий из п элементов

int (**aLines)[2] ? 

Я пытаюсь инициализировать:

int (**aLines)[2] = (int(**)[2]) new int*[10]; 
for(int i = 0; i < 10; i++){ 
    aLines[i] = new int[5][2]; 
} 
+0

Каково ваше требование? Инициализация ** ptr с использованием 2D-массива? –

+0

хотите ли вы сохранить два указателя 2D-массива? – minicaptain

+0

Если вам нужно отличить результат 'new', вы делаете это неправильно. – molbdnilo

ответ

0

Я включил пример кода как распределить, использовать и освободить статический массив с динамическим 2D-массивом.

Надеюсь, это полезно.

void allocate_print_and_deallocate_numbers() { 
    // Allocate 
    int **aLines[2]; 
    for (int i = 0; i < 2; i++) { 
     aLines[i] = new int* [10]; 
     for (int j = 0; j < 10; j++) { 
      aLines[i][j] = new int [5]; 
      for (int k = 0; k < 5; k++) { 
       aLines[i][j][k] = i + j + k; // Assign a number 
      } 
     } 
    } 

    // Use 
    for (int i = 0; i < 2; i++) { 
     for (int j = 0; j < 10; j++) { 
      for (int k = 0; k < 5; k++) { 
       std::cout << aLines[i][j][k] << std::endl; 
      } 
      std::cout << std::endl; 
     } 
     std::cout << std::endl; 
    } 

    // Deallocate 
    for (int i = 0; i < 2; i++) { 
     for (int j = 0; j < 10; j++) { 
      delete [] aLines[i][j]; 
     } 
     delete [] aLines[i]; 
     aLines[i] = NULL; 
    } 
} 
+0

Он на самом деле пытается получить A [m] [n] [2]; ваш код дает A [2] [m] [n] – zimbra314

+0

Хорошо. Его вопрос был очень неясен для меня, поэтому мне пришлось импровизировать. –

2

В C++ векторный контейнер должен быть выбран по умолчанию. Также следует избегать голых new. Избегайте динамического выделения объектов, если это необходимо. Следуя этим рекомендациям, вы получите код, который будет более безопасным и простым в обслуживании.

Вот как сделать вектор ints, указатель на указанный вектор и указатель на указанный указатель.

std::vector<int> v = {3,8,1,6}; 
std::vector<int>* p = &v; 
std::vector<int>** pp = &p; 

std::cout << p->front() << std::endl; 

std::cout << (*pp)->back() << std::endl; 

Я не уверен, что именно вы пытаетесь сделать в коде, который вы показали, но есть, конечно, лучше. Если вы описываете, что вы пытаетесь достичь, мы можем вам помочь.

+1

Вы также можете сделать 'std :: vector >>', если я хорошо понимаю код OP. Для инициализации это было бы в стиле 'myVect (10, std :: vector > (5, std :: vector (2)))' –

+0

Спасибо за ответ. Мне нужно было без STL. – kastiel

-1

Прежде всего следует избегать

int (**aLines)[2] 

Вид заявления. Я не очень помогаю, если вы знаете 2 заранее. Намного лучше использовать

int ***aLines 

, а затем уже вложенные циклы для initilize

aLines = new int**[10]; 
for (int i = 0; i < 10; ++i) 
{ 
    aLines[i] = new int*[5]; 
    for (int j = 0; j < 5; ++j) 
    { 
     aLines[i][j] = new int[2]; 

    } 
} 
+0

Возможно, это поможет, если они хотят ограничить размер массива '2'. Кроме того, добавление другого '*' к чему-то с '**' идет в неправильном направлении. Вы не должны использовать его в C++. – juanchopanza

+0

Я не думаю, что в C++ (gcc-4.7.2) есть какой-либо способ инициализировать int (** aLines) [2], не имея -fpermissive (что означает, что компилятор ему не очень нравится). Помимо этого ясность кода также важна для людей, если вы не участвуете в обфускации кода. Если ограничение элементов на 2 абсолютно необходимо, тогда я могу захотеть объявить ваш собственный тип данных или использовать long/int64 cleverly – zimbra314

+0

Вы можете указать, что он указывает на указатель на массив 'int [2]'. Это не имеет большого смысла, но и вопрос не имеет. – juanchopanza

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