Какая разница в
void AllocateArray(int **arr,int size)
а также:
void AllocateArray(int *arr,int size)
Я должен выделить только 1D массив с помощью обоих, и в чем разница?
Я полагаю, использование должно быть:
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
) передается по значению, это означает, что даже память выделяется внутри функции, это не имеет ничего общего с внешней переменной.
Как я могу выделить 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
вместо всех этих указателей. Вы будете в мире и чувствовать себя любимым.