C/C++

Почему вместо двумерного массива мы используем двойной указатеть?

Понятно что создав двойной указатеть мы получим такой же двойной массив. А зачем это делать именно так?
Двойной указатель (double pointer) - это указатель, который хранит адрес другого указателя. Он используется для создания двумерного массива в C и C++.

Обычно двумерный массив определяется так:
 int array[ROWS][COLS]; 
Где ROWS и COLS - это размеры массива. Однако, этот способ определения массива считается неэффективным, так как он занимает много памяти на стеке.

Двойной указатель же позволяет создать двумерный массив более эффективным способом, выделив память для него на куче (heap). Двойной указатель определяется так:
 int **array; 
После этого можно выделить память для массива с помощью функции malloc:
 array = (int **)malloc(ROWS * sizeof(int *)); 
Затем можно выделить память для каждой строки массива:
 for (int i = 0; i < ROWS; i++) { 
array[i] = (int *)malloc(COLS * sizeof(int));
}
После того как память была выделена, можно использовать двойной указатель как обычный двумерный массив, т.е. обращаться к элементам массива с помощью двух индексов:
 array[i][j] = value; 
Однако, следует помнить, что память, выделенная с помощью malloc, нужно освобождать с помощью функции free, когда она больше не нужна. Это можно сделать так:
 for (int i = 0; i < ROWS; i++) { 
free(array[i]);
}
free(array);
Использование двойного указателя позволяет создавать динамические двумерные массивы более эффективным способом, чем обычный двумерный массив. Он также позволяет изменять размеры массива во время выполнения программы. Но следует помнить, что память, выделенная с помощью malloc, нужно освобождать, когда она больше не нужна.
Бахтияр Алипов
Бахтияр Алипов
2 302
Лучший ответ
Алексей Гранкин А что без malloc двойной указатеть не создаётся?
Коля Колмопяев Насчёт эффективности это сомнительно. Понятно, что легче найти фрагменты памяти под одну строку, чем под линейный весь массив, а индексация через [ col] [row ] = value или в виде функции (col, row,value) дело вкуса
Алексей Гранкин Не знаю на счёт информативности, но вы тут текста настрочили много. Дам вам лучший ответ.
Так проще писать. Можно ещё создать одномерный массив и пересчитывать индексы самому
Коля Колмопяев страуструп не одобряет. Видимо в школе ссср учили лучше этому. А видеобуфер в винде выделяется ЛИНЕЙНО )))) а не коньячно **
Как я рад, что 10 лет назад выбрал не C++, а C#, а потом и вовсе в мир фронтенда, что бы такие вопросы не задавать. Я не знаю, наверное в контексте языка это несет какой-то очень большой смысл, что-то связанное с памятью, но компилятор не достаточно умный что бы это понимать самому, все ему объяснять нужно
..
........... .............
51 476
Алексей Гранкин С памятью это понятно, что это - намного более гибкий вариант. Потому что запихнуть в кучу много мелких массивчиков - гораздо проще и надёжнее, и удобнее при высвобождении памяти, чем один большой массив.
Наверное я сам ответил на свой вопрос.
Какой еще двойной указатель? Это указатель на указатель.
одномерный массив это - указатель.
а массив одномерных массивов это... правильно! массив указателей. То есть указатель на указатель.
Не совсем так. Изучи указатели, ссылки, массивы.
Серик Беккожин
Серик Беккожин
23 558