Witam
Mam pewien problem :
Napisałem sobie taką funkcję:
void find_mtx_max( int ** wsk, int r, int c)
{
int max=**wsk;
for (int i=0; i<r; ++i)
for(int j=0; j<c; ++j)
if (max<(*(*(wsk+i)+j)))
max=(*(*(wsk+i)+j));
cout << endl << endl << endl << max << endl << endl;
}
I teraz tak:
- Tworzę tablicę tablic :
int tablica2[5][2]={{10,1},{2,3},{4,5},{6,7},{8,9}};
- Wywołuję funkcję :
find_mtx_max(tablica2, 5, 2);
I tutaj pojawia się problem z tym że tablica2 to wg kompilatora nie jest typu wskaźnik na wskaźnik.
Wyrażenie tablica2[x][y] odpowiada wyrażeniu *(*(tablica2+x)+y) i jest wartością elementu (x,y)
Wyrażenie tablica2[x] jest wskaźnikiem na zerowy element wiersza x-owego
Wyrażenie tablica2 odpowiada wyrażeniu &tablica[0] czyli jest to adres wskaźnika pokazującego na początek wiersza zerowego
Wyrażenie tablica2 jest zatem wskaźnikiem na wskaźnik
Pytanie nr 1 :
Dlaczego więc do jasnej ciasnej nie jest możliwe wywołanie takiej funkcji w której za wskaźnik na wskaźnik jest podstawiane tablica2.
Pytanie nr 2 :
Czy zawsze jest tak że w przypadku gdy będziemy definiować tablicę tablic statycznych np. int tablica[5][2] = {...}; to czy zawsze będzie ona zapisywana w jednym nierozerwalnym bloku pamięci przeznaczonym na zmienne globalne ?
Inaczej : czy zdarzyć się może że przy takiej definicji wiersz np. drugi nie będzie leżał w pamięci pod adresem bezpośrednio za adresem określającym koniec wiersza pierwszego ?
Dodatkowo:
Próbowałem obejść ten błąd w ten sposób :
int ** ptrtab = &tablica2[0];
find_mtx_max(ptrtab, 5, 2);
Jednakże również i tutaj otrzymałem błąd na etapie kompilacji o niezgodności typów (int *) i (int **) a przecież jeśli tablica2[0] to adres początku zerowego wiersza to przecież jeśli pobiorę adres operatorem & to powinienem otrzymać wskaźnik na wskaźnik czyli typ (int **) - a jednak tak nie jest ponieważ kompilator zwraca błąd.
Jak to zrobić żeby było dobrze ?
Wiem że można sobie tą funkcję napisać inaczej aby przyjmowała za argument nie "wskaźnik na wskaźnik na daną" ale po prostu "wskaźnik na daną". Ale abym mógł to tak zrobić i później przesuwać ten jeden wskaźnik (arytmetyka wskaźników) to muszę mieć pewność że cały blok pamięci przeznaczony pod tablicę jest "nierozerwalny" a wskaźniki do elementów tablicy są kolejnymi liczbami naturalnymi...
Proszę uprzejmie o odpowiedzi.