Wskka?niki do tablic wielorymiarowych

Jul 24, 2012 1 Replies

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?


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.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required