Generalnie faktycznie zaczyna się od zera (z przyczyn mi nieznanych, niezrozumiałych i błędogennych ), ale już np w fortranie nr elementu = nr indeksu czyli 1 element to tab[1]. Chyba że sami zdecydujemy inaczej. Ps zwykle robię tablicę o jeden element za dużą, i numeruję elementy normalnie czyli od 1.
o matko =/ Ja tam wole numerowanie od zera, w większości przypadków upraszczał mi kodowanie,
np mapowanie macierzy MxN na tablice M*N:
- wzór przy indeksach od zera: y*N + x,
- przy numeracji od 1 (indeksy macierzy też od 1): (y-1) * N + (x-1) + 1 = (y-1)N + x.
Do tego komplikacje w C/C++, takie coś musiałoby być prawdą *(tab) = *(tab + 0) = tab[1] co z tym zrobić?
- ustalić że *(tab) i *(tab+0) jest błędne? za każdym razem trzeba by było pamiętać o dodawaniu extra 1 do tab przy odwołaniu w ten sposób, mało tego co z iterowaniem *(tab++) ?
- zrobić równość *(tab) = *(tab + 0) = *(tab + 1)? robi sie bez sensu ... pierwszy element byłby wskazywany dwa razy
- A może *(tab) = tab[1] *(tab+1) = tab[2] .. tutaj znowu inny problem... trzeba pamiętać kiedy indeksować od 0 a kiedy od 1, można się pogubić.
Zapomniałem jeszcze o jednej sytuacji, co z aplikacjami low level? Jak trzeba by było rozumieć przypisanie:
MemHandler* mem = 0xA00000; ?? To analogiczny problem jak wyżej. Jeżeli to oznacza że pierwszy element ma taki adres... to mem[1] ma taki adres... wiec czym jest (*mem) ??
Albo taki manewr:
int *handle = &tab[5]; co wskazuje na element nr 5?? (*handle+1)? czym znowu miało by być (*handle) ?