Как я могу выделить 1D массив, используя указатель на указатель (int **)

Какая разница в

void AllocateArray(int **arr,int size)

а также:

void AllocateArray(int *arr,int size)

Я должен выделить только 1D массив с помощью обоих, и в чем разница?

3

Решение

Я полагаю, использование должно быть:

int* arr;
AllocateArray(&arr, 10);
// array has been allocated, use arr[0]...arr[9].
// ...
delete[] arr;  // don't forget this

В соответствии с именем функции она может выделять память для массива. Такие как:

void AllocateArray(int **arr,int size) {
*arr = new int[size];
}

Второй AllocateArrayпараметр (т.е. int *arr) передается по значению, это означает, что даже память выделяется внутри функции, это не имеет ничего общего с внешней переменной.

2

Другие решения

Как я могу выделить 1D массив с помощью указателя на указатель (int **)

int **p=new int*[1];
*p=new int[20];

Но почему? Это очень плохо, чтобы сделать это так

В чем разница

void AllocateArray(int **arr,int size) может изменить адрес массива, а не только его содержимое. Другими словами:

int *p;
AllocateArray(&p,5);

Сможет изменить где p указывает на.

void AllocateArray(int *arr,int size) можно только изменить содержимое массива. Другими словами:

int *p;
AllocateArray(p,5);

Будет изменено содержание p не меняя, куда он указывает.

Постскриптум я знаю это pointer != array но поскольку это элементарный вопрос, мне не нужно было копаться в таких деталях для ОП.

Заключительное примечание:

Пожалуйста, используйте std::vector вместо всех этих указателей. Вы будете в мире и чувствовать себя любимым.

1

По вопросам рекламы [email protected]