Ошибка компиляции Cannot convert "int**" to "int*", "int*" to "int" - C (СИ)
Формулировка задачи:
Здравствуйте, есть код. Выдает 2 ошибки:
Cannot convert "int**" to "int*"
Cannot convert "int*" to "int"
Выделение памяти вроде бы правильное, но почему оно выдает ошибки не понятно. Кто может подскажите. Заранее спасибо.
Код:
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#define n 9
int main()
{
int *A;
int i, j;
int tmp;
srand(time(NULL));
A=(int**)malloc(sizeof(int*)*n);
for(i=0;i<n;i++){
A[i]=(int*)malloc(sizeof(int)*n);
}
printf("Ishodnaja matrix:\n\n");
for(i=0; i<n;i++)
{
for(j=0; j<n;j++)
{
*(A+i*n+j)=1+rand()%9;
printf("%d\t",*(A+i*n+j));
}
printf("\n");
}
printf("\nTrnsponirovannaja matrix:\n\n");
for(i=0; i<n; i++){
for(j=0;j<n;j++){
tmp=*(A+i*n+j);
*(A+i*n+j)=*(A+(n-i-1)*n+j);
*(A+(n-i-1)*n+j)=tmp;}
}
for(i=0; i<n; i++){
for(j=0; j<n;j++){
printf("%d\t",*(A+i*n+j));
}
printf("\n");
free(A);
}
getch();
return 0;
}Решение задачи: «Ошибка компиляции Cannot convert "int**" to "int*", "int*" to "int"»
textual
Листинг программы
*(*(A+i)+j)
Объяснение кода листинга программы
В данном коде происходит обращение к элементу массива по двойному индексу.
-
- указывает на то, что нужно обратиться к значению, а не к ссылке на него. (A+i) - обращение к элементу массива A по индексу i (индекс начинается с 0). (A+i)+j - обращение к элементу массива A по совокупности индексов i и j. Для понимания: если есть массив A, то A[0] будет первым элементом, A[1] - вторым, и так далее. Если мы хотим обратиться к элементу массива по двойному индексу, то сначала мы должны обратиться к элементу массива по первому индексу, а затем по второму. В данном коде это выглядит так: сначала мы обращаемся к элементу массива A по индексу i, затем по полученной ссылке мы обращаемся к элементу этого массива (который является массивом) по индексу j. Ошибка компиляции говорит о том, что некорректно происходит преобразование типов. Вероятно, вместо int* нужно было использовать int.