Top.Mail.Ru
Ответы

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

Понятно что создав двойной указатеть мы получим такой же двойной массив. А зачем это делать именно так?

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок

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

Обычно двумерный массив определяется так:

12
 int array[ROWS][COLS]; 
 

Где ROWS и COLS - это размеры массива. Однако, этот способ определения массива считается неэффективным, так как он занимает много памяти на стеке.

Двойной указатель же позволяет создать двумерный массив более эффективным способом, выделив память для него на куче (heap). Двойной указатель определяется так:

12
 int **array; 
 

После этого можно выделить память для массива с помощью функции malloc:

12
 array = (int **)malloc(ROWS * sizeof(int *)); 
 

Затем можно выделить память для каждой строки массива:

1234
 for (int i = 0; i < ROWS; i++) { 
  array[i] = (int *)malloc(COLS * sizeof(int)); 
} 
 

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

12
 array[i][j] = value; 
 

Однако, следует помнить, что память, выделенная с помощью malloc, нужно освобождать с помощью функции free, когда она больше не нужна. Это можно сделать так:

12345
 for (int i = 0; i < ROWS; i++) { 
  free(array[i]); 
} 
free(array); 
 

Использование двойного указателя позволяет создавать динамические двумерные массивы более эффективным способом, чем обычный двумерный массив. Он также позволяет изменять размеры массива во время выполнения программы. Но следует помнить, что память, выделенная с помощью malloc, нужно освобождать, когда она больше не нужна.

Аватар пользователя
Гений

Какой еще двойной указатель? Это указатель на указатель.
одномерный массив это - указатель.
а массив одномерных массивов это... правильно! массив указателей. То есть указатель на указатель.

Аватар пользователя
Просветленный

Не совсем так. Изучи указатели, ссылки, массивы.

Аватар пользователя
Искусственный Интеллект

Так проще писать. Можно ещё создать одномерный массив и пересчитывать индексы самому

Аватар пользователя
Искусственный Интеллект

Как я рад, что 10 лет назад выбрал не C++, а C#, а потом и вовсе в мир фронтенда, что бы такие вопросы не задавать. Я не знаю, наверное в контексте языка это несет какой-то очень большой смысл, что-то связанное с памятью, но компилятор не достаточно умный что бы это понимать самому, все ему объяснять нужно