Wskka?niki do tablic wielorymiarowych

Pytanie o arytmetykę wskaźników w C. Załóżmy że mam taka tablicę:

char Tab [][5] = { { 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x2f, 0x00, 0x00 }, { 0x00, 0x07, 0x00, 0x07, 0x00 }, { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, { 0xc4, 0xc8, 0x10, 0x26, 0x46 }, { 0x36, 0x49, 0x55, 0x22, 0x50 } };

robię sobie wskaźnik do niej w postaci:

  1. char *ptr1=Tab;
  2. char *ptr2=Tab[3];
  3. char *ptr3=&Tab[2][2];
  4. char *ptr4=&Tab[3];

Punkt 3 nie działa, jest błąd. Ale dlaczego w punkcie 2 to działa i do czego jest wtedy wskaźnik? Czy może mi ktoś łaskawie wytłumaczyć dlaczego to działa tak a nie inaczej. Nie za bardzo moge zrozumiec tą arytmetykę wskaźników?

Reply to
slawek7
Loading thread data ...

Użytkownik "slawek7" napisał w wiadomości

char Tab [][5] = { { 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x2f, 0x00, 0x00 }, { 0x00, 0x07, 0x00, 0x07, 0x00 }, { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, { 0xc4, 0xc8, 0x10, 0x26, 0x46 }, { 0x36, 0x49, 0x55, 0x22, 0x50 } };

  1. char *ptr1=Tab;
  2. char *ptr2=Tab[3];
  3. char *ptr3=&Tab[2][2];
  4. char *ptr4=&Tab[3];

w czystym C arytmetyka wskaznikow jest nieco zagmatwana, ale konsekwentna. Pamietac musisz ze a[b] to jest *(a+b), tak, mozna napisac 3[Tab], i to jest to samo co Tab[3].

p+n, jesli p jest wskaznikiem a n integerem, to jest tak naprawde oblicza p+n*sizeof(*p), z mozliwymi odstepstwami na maszynach o dlugim slowie.

Z tablicami jest ciekawiej, ale w wyrazeniach zachowuja sie jak wskazniki. Tylko sizeof calosci jest inny (znaczy sie sizeof(Tab)= 35, jesli dobrze licze)

Tab = tablica tablic znakowych. Czyli tez adres jej pierwszego elementu. Ktorym jest 5-znakowa tablica, wiec sizeof (*Tab) = 5 w pkt.1 powinno byc ostrzezenie ze sie typ nie zgadza, bo ptr1 to wskaznik na pojedynczy znak. Ale do ciagle sa adresy, wiec podstawienie jak najbardziej dziala.

Tab[3] = ta "podtablica". Czyli jak najbardziej adres ciagu znakow. typ dokladnie taki sam jak ptr2 - tez adres pojedynczego znaku - z mozliwoscia ciagu znakow.

Tab[2][2] = pojedynczy znak. &Tab[2][2] jak najbardziej jest adresem tego znaku i bledu nie powinno byc !

&Tab[3] ... adres 5-elementowej tablicy. znow powinienes miec ostrzezenie o drobnej niezgodnosci typu, identycznie jak w pkt 1.

J.

Reply to
J.F

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.