2016-08-12 8 views
0

Я забыл, как инициализировать массив указателей в C++, как следующее:Инициализация массива указателей в C++

int * array[10]; 

Является ли это правильным решением, как это? Здесь:

array = new int[10]; 

// is this the correct way?? 
+0

Что делать, если указатель является объектом другой структуры - то есть. определяемая пользователем структура ... Я предполагаю, что это так же? @sorosh_sabz вы можете привести пример? – perkes456

+0

'int * array [10] = {};' Инициализирует указатели на 'nullptr'. – juanchopanza

+1

* «как инициализировать массив указателей» * Это скорее зависит от того, для чего вы хотите его инициализировать. Какова цель упражнения? –

ответ

5
int * array[10]; 

определяет 10 указателей на 10 Int массивы статически

Ехать динамическая:

int **array = new int *[10]; 

Лучшее решение, так как вы используете C++: используйте std::vector

std::vector<int *> v; 
v.resize(10); 
v[2] = new int[50]; // allocate one array 

Поскольку мы используя векторы для массива указателей, позволяет полностью избавиться от указателей

std::vector<std:vector<int> > v; 
v.resize(10); 
v[2].resize(50); // allocate one array 

Затем доступ к массиву как матрица:

v[3][40] = 14; 

идти дальше, один путь, чтобы инициализировать все строки, используя C++ 11, что делает 10x50 Int матрицу в конце (но размер также может меняться внутри цикла, если мы хотим). Требуется gcc 4.9 и g++ -std=c++11 построить

std::vector<std::vector<int> > v; 
v.resize(10); 
for (auto &it : v) 
{ 
    it.resize(50); // allocate arrays of 50 ints 
} 
+0

Это в значительной степени покрывает все, что мне нужно! Благодаря! – perkes456

+2

Еще лучше, используйте 'std :: array' для статической части, например. 'std :: array , 10>'. – Holt

+0

Не знал этого. Хороший. Но ОП хотел, чтобы он был динамичным. Я буду помнить об этом. –

3
int **array = new int*[length]; 

Или без динамической allocaction памяти:

int *array[10]; 
+0

Это не он ... Может кто-то просто скажет мне, должен ли я использовать оператор «NEW» с массивом указателей при его инициализации ...gosh lol – perkes456

+1

, если вы не хотите динамического выделения: int * array [50]; –

+0

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

0

Первогоint* array[10] бы создать массив из 10 Int указателей, которые будут initlized к значениям мусора так наилучшая практика для то есть

int* array[10]; 
for(int i = 0;i<10;i++) 
{ 
    array[i] = NULL; 
} 

Tha t будет безопасно объединять все указатели с соответствующим значением, так что если вы попытаетесь получить доступ к тому, что вы не сохранили, то он будет каждый раз вызывать ошибку seg.

Второйarray = new int[10] создает указатель на массив из 10 целых чисел, который является совершенно другой вещью. Если вы хотите создать массив указателей с использованием new что бы

int** array = new int*[10];

+1

Вам не нужен цикл для инициализации элементов в NULL. См. Мой первый комментарий. то, что вы показываете, далека от лучшей практики. – juanchopanza

+0

Зависит от компилятора, более старые, такие как gcc, не имеют значений по умолчанию для примитивов, что обычно означает, что когда-либо фрагментированные биты все еще были в памяти, когда он был выделен, все равно будет и начальное значение переменной –

+0

Согласно моему комментарий к OP, 'int * array [10] = {}; Done. Нет необходимости в циклах. – juanchopanza

0

ITNOA

вы можете использовать

int* a = {new int(....), new int(....) ,... 

или что-то вроде ниже

for (int b = 0; b < 10; ++b) 
a[b] = new int(....); 

Я думаю, this link хорошо разбираются ain о массиве указателей.

0

Вы можете иметь что-то вроде этого -

int **array = new int*[n](); //n is the number of pointers you need. 
//() after declaration initializes all pointers with nullptr 
+0

, а также ответ на вопрос частично. –

+0

@ Jean-FrançoisFabre за исключением отсутствия инициализации массива указателей? – juanchopanza

+0

Я думал, что он просто хотел синтаксиса объявления. Но так или иначе, 'int ** array = new int * [n]();' Это также инициализирует массив. – Zeokav

0

В целом в большинстве случаев не существует большое чувство, чтобы инициализировать массив с точными адресами. Вы можете назначить адреса или выделить соответствующую память во время использования массива.

Обычно существует смысл инициализировать массив указателей с нулевыми указателями. Например

int * array[10] = {}; 

Если вы хотите объявить массив и сразу же выделить память для каждого элемента массива можно написать, например

int * array[10] = 
{ 
    new int, new int, new int, new int, new int, new int, new int, new int, new int, new int 
}; 

или

int * array[10] = 
{ 
    new int(0), new int(1), new int(2), new int(3), new int(4), new int(5), new int(6), new int(7), new int(8), new int(9) 
}; 

Но в любом случае было бы лучше выполнить назначение с использованием некоторого цикла или стандартного алгоритма, потому что в целом массив может иметь более 10 элементов.

Также вы не должны забывать удалить всю выделенную память. Например

std::for_each(std::begin(array), std::end(array), std::default_delete<int>()); 

Или, если вы уже определили объекты типа Int вы могли бы написать, например

int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; 
//... 
int * array[10] = 
{ 
    &x0, &x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &x9 
}; 

Такая инициализация используется очень часто для массивов указателей на функции.

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