Знающие люди подскажите как обращаться к элементу при следующем выделении памяти под двухмерный массив:
1)double **matr = new double *[row]
2)double *matr = new double [row*n]
В первом случае вроде бы так: *(*(matr+i)+j);
Другие языки программирования и технологии
Выделение памяти и обращение к элементам C++
> В первом случае вроде бы так: *(*(matr+i)+j);
Нет, это как раз для второго случая. Тут выделяется непрерывный участок памяти и адрес элемента вычисляется данным простым действием.
Для первого случая выделяется память под указатели на строки и еще нужно в цикле выделить память для каждой строки. А обращаться к такому массиву можно точно также, как к автоматическим или статическим:
for (size_t r = 0; r < row; ++r) matr[r] = new int[col];
...
... matr[r][c] ...
Нет, это как раз для второго случая. Тут выделяется непрерывный участок памяти и адрес элемента вычисляется данным простым действием.
Для первого случая выделяется память под указатели на строки и еще нужно в цикле выделить память для каждой строки. А обращаться к такому массиву можно точно также, как к автоматическим или статическим:
for (size_t r = 0; r < row; ++r) matr[r] = new int[col];
...
... matr[r][c] ...
1)
выделяется только память под массив указателей на массивы(одномерный, "список строк").
надо ещё под второе измерение память выделить в цикле на каждый указатель(сами "строки") и заполнить первый массив указателями на них
и только тогда
"*(*(matr+i)+j)"
даст этот элемент
разбор конструкции:
"matr" - указатель на массив `указателей на строки`(он же указатель на 0-й элемент массива указателей на строки, те указатель на `указатель на 0-й массив-строку`)
"matr+i" -- указатель на `указатель на i-й массив-строку`
"*(matr+i)" -- указатель на i массив-строку(он же "matr[ i]"). если память под строку не выделена, то указывает в NULL или в мусор
"(*(matr+i))+j "-- указатель на j-й элемент i-го массива-строки(он же "(matr[ i])+j")
"*( (*(matr+i)) +j )" -- j-й элемент i-го массива-строки(он же "matr[ i][ j]")
2)
тут сразу выделяется память единым непрерывным куском в одномерном массиве
и обращаться к элементу надо не двумерно, а одномерно вычисляя его положение
"*(matr+i*n+j)"
или
"matr[ i*n+j]"
выделяется только память под массив указателей на массивы(одномерный, "список строк").
надо ещё под второе измерение память выделить в цикле на каждый указатель(сами "строки") и заполнить первый массив указателями на них
и только тогда
"*(*(matr+i)+j)"
даст этот элемент
разбор конструкции:
"matr" - указатель на массив `указателей на строки`(он же указатель на 0-й элемент массива указателей на строки, те указатель на `указатель на 0-й массив-строку`)
"matr+i" -- указатель на `указатель на i-й массив-строку`
"*(matr+i)" -- указатель на i массив-строку(он же "matr[ i]"). если память под строку не выделена, то указывает в NULL или в мусор
"(*(matr+i))+j "-- указатель на j-й элемент i-го массива-строки(он же "(matr[ i])+j")
"*( (*(matr+i)) +j )" -- j-й элемент i-го массива-строки(он же "matr[ i][ j]")
2)
тут сразу выделяется память единым непрерывным куском в одномерном массиве
и обращаться к элементу надо не двумерно, а одномерно вычисляя его положение
"*(matr+i*n+j)"
или
"matr[ i*n+j]"
Похожие вопросы
- Выделение памяти в C
- Язык си, не могу понять динамическое выделение памяти.
- Вычислить сумму элементов массива, расположенных между первым и вторым отрицательными элементами - C++
- Напишите пожалуйста примеры функций выделения памяти и освобождения памяти (с аргументами) в С++ ?
- Вопрос для людей, знающих С/С++ -динамическое выделение памяти
- взять из массива наибольший элемент c++. Возможно ли это? и как?
- Помогите с решением задач по С по теме "Динамическое выделение памяти"!
- Помогите испрвить код Переписать первые элементы каждой строки матрицы a(n*m), больше некоторого числа C, в массив b .
- c++ new\delete: смысл выделения и освобождение памяти для озу из самой же озу?
- Microsoft Visual C++ 6.0 В одномерном массиве, состоящем из n вещественных элементов, вычислить...