2010-04-01 5 views

Odpowiedz

6

Ponieważ kompilator musi dowiedzieć się, jak uzyskać dostęp do danych z pamięci. Pierwszy wymiar nie jest ważny, ponieważ kompilator może policzyć liczbę elementów, gdy podane są wszystkie inne rozmiary.

Przykłady:

int a1[] = { 1, 2, 3, 4 } 

kompilator wie przeznaczyć przestrzeń dla 4 liczb całkowitych. Teraz, z tym:

int a2[][] = { 1, 2, 3, 4, 5, 6} } 

kompilator nie może zdecydować, czy powinien być A2 [1] [6] lub A2 [2], [3], lub a2, [3], [2] lub A2 [6] [1] . Gdy powiesz mu drugi wymiar, może obliczyć pierwszy.

Na przykład próba dostępu do elementu a2 [1] [0] może przynieść różne wartości w zależności od deklaracji. Możesz uzyskać 2, 3, 4 lub nawet nieprawidłową pozycję.

+0

Czy mógłbyś podać przykład? Jak to jest, że jeśli mam [3] [4] kompilator potrzebuje tylko [] [4]? Nie mogę tego zrozumieć. Naprawdę. –

+0

Daje kompilatorowi wystarczającą ilość informacji, aby wiedzieć, jak rozmieścić rzeczy w pamięci. Jeśli masz 12 elementów i powiesz je [] [], mogą to być dowolne dwie liczby (x i y), które mnożą się do 12. Jeśli dasz mu [] [4], wie, że x i 4 pomnożyć do 12 , więc x musi być 3. Jeśli pomaga to uczynić go logicznym, ustaw podstawowe równanie z każdym wymiarem po lewej stronie i całkowitą liczbą elementów po prawej stronie. Jest to trudne lub niemożliwe do rozwiązania dla więcej niż jednej zmiennej. – ssube

+0

@peachykeen: jest to nieco mylące. Wymiary są potrzebne do obliczenia adresu elementu tablicy. Pierwszy wymiar nie jest jednak potrzebny, ponieważ nie jest wymagany do obliczania adresu (górna granica jest nieistotna). –

1

Usiądź i znajdź pozycję pamięci a[i][j], biorąc pod uwagę pozycję początkową tablicy.

Zauważ, że c tablice są rozplanowane jak niniejszej noty a[0][0]a[0][1]a[0][2] ... a[0][M]a[1][0] ...

Side: FORTRANIE tablice są określone inaczej: a[1][1]a[2][1]a[3][1] ... a[N][1]a[1][2] ..

Zauważ, jak zmieniłoby to , który wymiar jest potrzebny do znalezienia pozycji pamięci.

4

To nie jest "drugi wymiar" (z wyjątkiem sytuacji, gdy masz tylko dwa wymiary) - to "wszystko, ale nie pierwszy wymiar". Możesz na przykład mieć int a[][2][3][4]. Bez tych wymiarów nie byłoby możliwe obliczenie adresu elementu.

Powiązane problemy