Pracuję nad przydziałem zadań domowych do mnożenia macierzy z dynamicznie przydzielanymi tablicami 2d. Pisałem następujące funkcje załadować matrycy:Różnica między ** i & ** w C w kontekście macierzy 2D
void loadMatrix(FILE* fp, int** matrix, int rowSize, int colSize) {
for (int i = 0; i < rowSize; i++) {
for (int j = 0; j < colSize; j++) {
fscanf(fp, "%d", &matrix[i][j]);
}
}
}
Deklaruję macierz jako zmienną globalną w następujący sposób:
int **a;
a następnie zainicjować i załadować go w następujący sposób:
// allocate memory for the array rows
a = (int **) malloc(m * sizeof(int*));
// allocate memory for array columns
for (int i = 0; i < m; i++) {
a[i] = malloc(k * sizeof(int));
}
loadMatrix(fp, a, m, k);
Wszystko działa zgodnie z oczekiwaniami, jednak podpis funkcji podany przez nauczyciela jest następujący:
void loadMatrix(FILE*, int ***, int, int);
Próbowałem użyć tej sygnatury i przekazać adres macierzy przy użyciu & i usunąć & z mojej funkcji loadMatrix, myśląc, że wyjścia powinny być takie same, ale używanie *** nie działa zgodnie z oczekiwaniami. czego mi brakuje? Jaka byłaby korzyść z używania potrójnych wskaźników, jeśli taki istnieje?
'loadMatrix (fp, & a, m, k);' i do malloc'd wewnątrz funkcji. – BLUEPIXY
Wystarczy zmienić '& matrix [i] [j]' na '& (* matrix) [i] [j]' w 'fprintf' i wywołanie funkcji na' loadMatrix (fp, & a, m, k); '. – haccks
@Haccks wow, który działał dobrze. Dlaczego tak jest? Czuję, że & i * w pewnym sensie powinni się wzajemnie pozbyć. Co ja nie rozumiem? –