Я забыл, как инициализировать массив указателей в C++, как следующее:Инициализация массива указателей в C++
int * array[10];
Является ли это правильным решением, как это? Здесь:
array = new int[10];
// is this the correct way??
Я забыл, как инициализировать массив указателей в C++, как следующее:Инициализация массива указателей в C++
int * array[10];
Является ли это правильным решением, как это? Здесь:
array = new int[10];
// is this the correct way??
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
}
int **array = new int*[length];
Или без динамической allocaction памяти:
int *array[10];
Это не он ... Может кто-то просто скажет мне, должен ли я использовать оператор «NEW» с массивом указателей при его инициализации ...gosh lol – perkes456
, если вы не хотите динамического выделения: int * array [50]; –
новый оператор специально для динамического выделения памяти из кучи, он не статически выделяется компилятором, поэтому использование нового - это огромное отличие от обычного способа, кроме того, что вы должны специально удалить память. –
Первого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];
Вам не нужен цикл для инициализации элементов в NULL. См. Мой первый комментарий. то, что вы показываете, далека от лучшей практики. – juanchopanza
Зависит от компилятора, более старые, такие как gcc, не имеют значений по умолчанию для примитивов, что обычно означает, что когда-либо фрагментированные биты все еще были в памяти, когда он был выделен, все равно будет и начальное значение переменной –
Согласно моему комментарий к OP, 'int * array [10] = {}; Done. Нет необходимости в циклах. – juanchopanza
ITNOA
вы можете использовать
int* a = {new int(....), new int(....) ,...
или что-то вроде ниже
for (int b = 0; b < 10; ++b)
a[b] = new int(....);
Я думаю, this link хорошо разбираются ain о массиве указателей.
Вы можете иметь что-то вроде этого -
int **array = new int*[n](); //n is the number of pointers you need.
//() after declaration initializes all pointers with nullptr
, а также ответ на вопрос частично. –
@ Jean-FrançoisFabre за исключением отсутствия инициализации массива указателей? – juanchopanza
Я думал, что он просто хотел синтаксиса объявления. Но так или иначе, 'int ** array = new int * [n]();' Это также инициализирует массив. – Zeokav
В целом в большинстве случаев не существует большое чувство, чтобы инициализировать массив с точными адресами. Вы можете назначить адреса или выделить соответствующую память во время использования массива.
Обычно существует смысл инициализировать массив указателей с нулевыми указателями. Например
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
};
Такая инициализация используется очень часто для массивов указателей на функции.
Что делать, если указатель является объектом другой структуры - то есть. определяемая пользователем структура ... Я предполагаю, что это так же? @sorosh_sabz вы можете привести пример? – perkes456
'int * array [10] = {};' Инициализирует указатели на 'nullptr'. – juanchopanza
* «как инициализировать массив указателей» * Это скорее зависит от того, для чего вы хотите его инициализировать. Какова цель упражнения? –