Динамические матрицы (указатели на указатели) - C (СИ)
Формулировка задачи:
Никак не могу осознать указатели на указатели.
Вот есть объявление
Потом следует
Далее понятие строки используется для понятности.
Т.е. просто А это указатель на начала строк, а *А это указатель на элемент внутри строки?
Т.е. ++А это переход к новой строке , а ++*А это переход к следующему элементу строки?
В многомерных случаях *******А, получается, А это самый верхний уровень, потом ниже и т.д.?
У меня вылезает ошибка в
Пишет cannot convert double* to double in assignment во 2-ой и 4-ой строчках.
И ещё вопросик
Ругается и пишет
warning: converting to 'int' from 'double'
double **A;
A=new double[m];
for (int i=0;i<m;++i){
*A[i]=new double[n];
}double **A_;
A_=new double[m+2];
for (int i=0;i<m+2;++i){
*A_[i]=new double[n];
}const int EPS=0.00001;
Решение задачи: «Динамические матрицы (указатели на указатели)»
textual
Листинг программы
a[i] === *(a+i) a[i][j] === *(*(a+i)+j)
Объяснение кода листинга программы
- Объявление матрицы
aтипа указатель на указатель типа int: int **a; - Указатель
aинициализируется значением, указывающим на начало памяти, выделенной под матрицу: a = (int *) malloc(m sizeof(int *)); - Для каждого i-го элемента матрицы (от 0 до m-1) выполняется: a[i] = (int ) malloc(n sizeof(int)); Если выделение памяти под i-й элемент матрицы не удалось, то программа выведет сообщение об ошибке и завершит свое выполнение.
- Указатель
aиспользуется в качестве базового адреса для выделения памяти под i-й элемент матрицы: a[i] = (int *) (a + i); - Значение a[i][j] можно получить, используя формулу: a[i][j] = ((a+i)+j);
- Если требуется изменить значение a[i][j], то необходимо изменить значение указателя a[i][j], используя формулу: ((a+i)+j) = новое_значение;
- Для освобождения памяти, выделенной под матрицу, используется функция free(): free(a);