Wskaźniki do wskaźników,tablice 2D

0

Hej,

umiał by mnie ktoś naprowadzić na poprawną drogę rozumowania tych pokręconych wskaźników ?
Wydawało mi się ,że już w miarę wszystko rozumiem kiedy to trafiłem na przykład gdzie nie mogę rozróżnić argumentu funkcji "int** array" od "int (*array)[size]" ...

Jak to jest z tymi tablicami dwuwymiarowymi,że w jednym przypadku wystarczy przekazać wskaźnik na wskaźnik a w innym tablice wskaźników?

Np działająca funkcja wyświetlająca tablicę 10x10 wygląda tak:

 void print( int (*array)[10] )
{
//...
}; 

A funkcja wypełniająca tablicę 10x10 może wyglądać już tak:

 void fill( int ** array )
{
//...
};

i też działa...

Przecież to chyba nie to samo nie?
Będę wdzięczny za każdą pomoc :)
Pozdrawiam

1
int (*array)[10]

To nie jest tablica wskaźników. To jest wskaźnik do tablicy 10-elementowej. Tablica 10 wskaźników wygląda tak:

int* array[10]

Wyobraź sobie, że masz jeden zwykły wskaźnik

int* wsk;

Ten wskaźnik może wskazywać na 1 element

wsk = new int;

ale może również wskazywać na "tablicę" takich elementów (technicznie rzecz biorąc to nie tablica, tylko ciągły obszar pamięci)

wsk = new int[10];

W drugim przypadku odwołujesz się do kolejnych elementów tablicy używając skrótowego zapisu

wsk[0] wsk[1] wsk[2]

które są cukrem syntaktycznym dla

*(wsk+0) *(wsk+1) *(wsk+2)

Wracając do pierwszego przykładu, wskaźnik na tablicę 10-elementową może wskazywać na jedną tablicę, ale może również wskazywać na tablicę takich tablic. Wtedy

array[0]

to pierwsza tablica

array[1]

to druga tablica itd. i w obrębie każdej tablicy możemy się odwołać do pojedynczych elementów.

Podobnie jest sytuacja z

int** array

Jest to wskaźnik na wskaźnik, ale wskazuje na tablicę wskaźników, i każdy z tych wskaźników zamiast wskazywać na 1 element to wskazuje na całą tablicę elementów.

0

A czy w takim razie tablica utworzona dynamicznie różni się czymś od utworzonej statycznie?
Bo zauważyłem również, że do funkcji jako argumenty przekazuje się je w zupełnie inny sposób.

Funkcja dla statycznej musi wyglądać zupełnie inaczej niż dla dynamicznej:


//.....

int arrayStatic[4][4];

int** arrayDynamic=new int *[4];
for(int i=0;i<5;i++) arrayDynamic[i]=new int[4];

//.....



void funcForDynamicArray( int **array ){};

void funcForStaticArray( int (*array)[4] ){};

 

Głównym problemem przeszkadzającym mi zrozumienie tego wszystkiego jest to,ze pamiętam jeszcze z książki S.Praty do C ,że przy przekazywaniu tablicy dwuwymiarowej do funkcji musimy podać ten jeden wymiar w klamrach,aby kompilator "mógł wiedzieć" o ile przeskakiwać kolumn przy zmianie wiersza na następny z kolei.Więc jak to jest kiedy przekazujemy tylko coś pokroju int** ,przecież kompilator "nie wie"...

1

A czy w takim razie tablica utworzona dynamicznie różni się czymś od utworzonej statycznie?
"Tablica" utworzona dynamicznie to nie jest tablica, tylko ciągły obszar pamięci. Po prostu przekazujemy wskaźnik do początku tego obszaru.
Tablica utworzona statycznie to prawdziwa tablica.

Chyba głównym problemem jest nieprawdziwe twierdzenie

A funkcja wypełniająca tablicę 10x10 może wyglądać już tak:

void fill( int ** array )

Takiej tablicy

int tab[10][10]

nie przekażesz do funkcji oczekującej int**

1 użytkowników online, w tym zalogowanych: 0, gości: 1