/ / Różnica między wielowymiarowymi tablicami a tablicą wskaźników - c, tablice

Różnica między wielowymiarowymi tablicami a tablicą wskaźników - c, tablice

Zawsze wierzyłem, że w C:

int a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

odnosi się do tablicy tablic iw pamięci piętnaście sąsiednich bloków jest przechowywanych, ale a[0] jest wskaźnikiem do a[0][0] i a[1] jest wskaźnikiem do a[1][0] i tak dalej. Więc pomyślałem, że jest podobny do tablicy wskaźników. Jaka jest różnica między nimi?

Odpowiedzi:

2 dla odpowiedzi № 1

Tablice i wskaźniki mają bardzo ciekawy izwiązek intymny w C (i C ++). W większości kontekstów, jeśli masz coś, co jest "tablicą X", to zostanie ona po cichu przekształcona w "wskaźnik do X", który wskazuje na pierwszy element tablicy.

Twoje przekonanie, że

int a[5][3];

tworzy tablicę tablic jest całkowicie poprawna. Zgodnie z deklaracją jest to array of 5 arrays of 3 ints i zajmuje w pamięci 15 ciągłych liczb całkowitych.

Gdzie popełnisz błąd, to wierzysz a[0] być wskaźnikiem. W rzeczywistości, a[0] jest pierwszą pod-tablicą a i sam jest array of 3 ints. Jednak ze względu na ciekawy związek między wskaźnikami a tablicami, wyrażenie a[0] prawie zawsze jest konwertowany na wskaźnik.

Jedna z głównych różnic między tablicątablice i tablica wskaźników znajdują się w miejscu, w którym znajdują się elementy tablicy. Tablica tablic zawsze będzie zajmowała ciągły blok pamięci, ale wskaźniki w tablicy wskaźników będą odnosiły się do własnych (często rozłącznych) bloków pamięci.


0 dla odpowiedzi nr 2

Tablice i wskaźniki luźno utożsamiają się z tym samymrzecz. Kiedy zadeklarujesz tablicę N long, przydzielasz blok N pamięci long (razy wielkość typu wartości) i zwracasz wskaźnik do pierwszego elementu. arr[2] następnie pobierz wartość z tej pamięci, licząc do przodu od tego pierwszego wskaźnika. Jeśli masz tablicę tablic, to wszystko, co przechowujesz w pierwszym (w twoim a array) to wskaźniki do miejsca przechowywania innych tablic. (To powiedziawszy, uważam, że powinny one być w ciągłym bloku, jak powiedziałeś)

Czy to trochę pomaga w wyjaśnieniu?


0 dla odpowiedzi № 3
 int a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

Jest to prawdziwa tablica dwuwymiarowa: 15 int Wielkości zostały odłożone na bok, a konwencjonalny prostokątny indeks dolny jest używany do znalezienia elementu a[row][col]

int *b[5];

Jest to tablica wskaźników, które przydzielają 5 wskaźników i nie są inicjowane, ale a[3][2] i b[3][2] są składniowo legalnymi odniesieniami do pojedynczej int.

Zakładając, że każdy element b robi wskaż trzyelementową tablicę, wtedy będzie 15 ints odłożyć na bok, plus pięć komórek dla wskaźniki.

Ważną zaletą tablicy wskaźników jest to, że mogą to być wiersze tablicy różne długości. Oznacza to, że każdy element b nie muszą wskazywać na trzyelementowy wektor, niektóre może wskazywać na dwa elementy, niektóre do dziewięciu, a niektóre do żadnego.