Uczę się C++. Jestem przy tablicach, mam pewien dylemat. W Gręboszu napisane jest że tablice przechowywane są "rzędami" w pamięci, jeden za drugim. Czyli tablica int [4][2] zajmuje ciągły obszar w pamięci 8*sizeof(int). W związku z tym mając wskaźnik na pierwszy element i zwiększając go 8 razy powinniśmy móc wypisać wszystkie elementy tablicy. No i jako że zmienna tablicowa jest zarazem adresem zerowego elementu chciałem to właśnie ją zwiększać. W przypadku jednowymiarowych tablic to działa:
int main(){
int a[4][2] = {1, 2, 3, 4, 5, 6, 7, 8};
int *w = &a[0][0];
for (int i = 0;i < 8;i++)std::cout << *(w++) << ' ';
std::cout << std::endl;
for (int i = 0;i < 8;i++)std::cout << *(*a + i) << ' ';
getchar();
}
I nie mogę zaczaić dlaczego trzeba pisać *(*a + i), a jak jest trójwymiarowa tablica to trzeba pisać
*(**a + i)
, a potem *(***a + i)
. Czyli że co <code class="cpp">*a
to jest dopiero wskaźnik na pierwszą dwójkę, i to jego musimy zwiększać ?
A przy okazji jeszcze kilka głupich pytań:
Jeśli zwalniamy dynamicznie utworzoną tablicę używamy operatora</li>
</ol>
delete [] zmienna;
skąd to delete wie ile ma zwolnić, skoro ponoć nie ma sposobu aby dowiedzieć się ile elementów ma tablica ?
Jak to jest że wskaźnik to nie tylko informacja o adresie ale także o typie zmiennej na którą wskazuje ? Skoro cały ma 4 bajty (ew. 8 dla x64) to gdzie ta informacja o typie się "mieści" ?</li>
</ol>
b