/ / Przekazywanie wskaźników (macierzy) do funkcji w c [duplikat] - c, wskaźniki, macierz, tablice dynamiczne, alokacja dynamiczna

Przekazywanie wskaźników (macierzy) do funkcji w c [duplikat] - c, wskaźniki, macierz, tablice dynamiczne, alokacja dynamiczna

Dynamicznie utworzyłem macierz za pomocą calloc w zwykły sposób:

int **matrix;
int dim,r;
scanf("%d",&dim);
matrix=(int **)calloc(dim, sizeof(int *));
for(r=0; r<dim; r++)
{
matrix[r]=(int *)calloc(dim, sizeof(int));
}

Teraz, gdy chcę utworzyć funkcję, która po prostu wydrukuje elementy tej matrycy, powinienem napisać coś takiego:

void stampmatrix(int **matrix, int dim)
{
int r=0, c=0;
for(r=0; r<dim; r++)
{
printf("(");
for(c=0;c<dim;c++)
{
printf(" %d , ",matrix[r][c]);
}
printf(")");
}
}

I to działa dobrze. Teraz dodaję ten wiersz do poprzedniej funkcji

`...`
matrix[r][c]=1;
printf(" %d , ",matrix[r][c]);
...

Jeśli wywołam tę funkcję w moim głównymfunkcjonować, stampmatrix (matryca, przyciemniony) po uruchomieniu programu kompilator powinien utworzyć kopię mojej matrycy, wypełnić ją 1, a następnie wydrukować je, a następnie powrócić do mojej głównej funkcji bez zmiany faktycznej macierzy. Ale jeśli to zrobię, a następnie sprawdzę mój głównyfunkcja wartości moich elementów macierzy, są one zmieniane na 1. W klasie powiedziano mi, że jeśli przekażę wartości do funkcji, program tworzy kopię wartości, współpracuje z nimi, a następnie anuluje kopiowanie, więc muszę przekazać adresy do funkcji, aby faktycznie zmienić zawartość mojej zmienne w mojej głównej funkcji. Dlaczego w tym przypadku to nie działa i zmienia moje wartości macierzy? Jest tak, ponieważ nadal przekazuję wskaźniki do funkcji znacznika? Naprawdę nie rozumiem. Nie powinna to być funkcja:

void stampfunction(int dim, int ***matrix)

A może dlatego, że użyłem funkcji void? Dziękuję za uwagę!

Odpowiedzi:

0 dla odpowiedzi № 1

Pamiętaj, że w tym programie (jak zakładam) cały kod ma tę samą stertę (pamięć), a wskaźniki są w pewnym sensie jak drogowskazy dla tej sterty.

Jaka metoda

void stampmatrix(int **matrix, int dim)

robi się tak, jak gdy podajesz komuś numer, dimi fizyczną mapę, powiedzmy, wszystkich drogowskazów do jabłek w siatce.

Więc tak, przekazałeś wartość wskazówki do matrycy - dałeś osobie kopię swojej mapy drogowskazów z jabłkami.

Inną rzeczą, którą zrobiłeś, jest to matrix[r][c] w sposób dorozumiany wyklucza wskaźnik - lub metoda mówi, aby podążać za kierunkami oznaczeń jabłko-mapa aż do punktu (r, c) w tej siatce.

Więc kiedy mówisz „macierz [r] [c] = 1”, mówisz, aby upewnić się, że jest tylko jedno jabłko w (r, c) po wyjściu. Dlatego wartość w macierzy [r] [c] zmieniony.